C++数据结构笔记(11)二叉树的#号创建法及计算叶子节点数

首先分享一段计算叶子节点数目的代码,如下图:

C++数据结构笔记(11)二叉树的#号创建法及计算叶子节点数_第1张图片

不难发现,上面的二叉树叶子节点数目为4。我们可以采用递归的方式,每当一个结点既没有左结点又没有右节点时,即可算为一个叶子结点。

int num=0;
//全局变量,代表叶子节点数
void CaculateLeafNum(BinaryNode* root)
{
	if(root==NULL)
		return;
	if(root->lchild==NULL&&root->rchild==NULL)
		num++;
	//递归计算两个子树的叶子节点
	CaculateLeafNum(root->lchild);
	CaculateLeafNum(root->rchild);
	
	return;
} 

 如上时单独的方法名,在文末的全段代码中加入即可计算,输出的 num即为叶子结点数。

C++数据结构笔记(11)二叉树的#号创建法及计算叶子节点数_第2张图片

众所周知,根据某一顺序单一的遍历结果,并不能唯一地确定一颗二叉树,而通过中序和先序,或者中序和后序,即可以确定唯一的一颗二叉树,但是先序和后序不能   !这是因为,通过先序或者后序,可以判断出根结点,再根据中序区分左右子树——而先序+后序就不能判断出来。

也就是说,如果已知根结点的左右子树结点数目,那么只需要知道根结点,即可判断出唯一的二叉树。这里给出一种崭新的方式,当遍历位置上的结点为空时,我们可以人为地加入结点“#”来代替空结点,这样当我们得到一种无论什么方式的遍历,都可以得出唯一地二叉树!

BinaryNode* CreateBinaryTree(){
	fflush(stdin);
	//清除缓存区的函数 
	char ch;
	//标准输入 
	scanf("%c",&ch);
	
	BinaryNode* node;
	
	if(ch=='#')
		node=NULL;
		//用#号标识空结点 
	else{
		node=(BinaryNode*)malloc(sizeof(BinaryNode));
		//开辟内存区 
		node->ch=ch;
		//为当前结点赋值 
		node->lchild=CreateBinaryTree();
		//先递归创建左子树 
		node->rchild=CreateBinaryTree();
		//再递归创建右子树 
	}
	return node;
} 

上述代码为#号法创建二叉树的具体实现。

如下是完整代码:

#include 
#include 
#include 
#include 
using namespace std;
 
typedef struct BinaryNode{
	char ch;
	struct BinaryNode* lchild;
	struct BinaryNode* rchild;
}BinaryNode;

BinaryNode* CreateBinaryTree(){
	fflush(stdin);
	//清除缓存区的函数 
	char ch;
	//标准输入 
	scanf("%c",&ch);
	
	BinaryNode* node;
	
	if(ch=='#')
		node=NULL;
		//用#号标识空结点 
	else{
		node=(BinaryNode*)malloc(sizeof(BinaryNode));
		//开辟内存区 
		node->ch=ch;
		//为当前结点赋值 
		node->lchild=CreateBinaryTree();
		//先递归创建左子树 
		node->rchild=CreateBinaryTree();
		//再递归创建右子树 
	}
	return node;
} 
void RecursionMiddle(BinaryNode* root)
{
	if(root==NULL)
		return;
	RecursionMiddle(root->lchild);
	cout<<(root->ch)<<" "; 
	RecursionMiddle(root->rchild);
	//中序遍历的顺序为:左-根-右 	
}




int main(int argc, char** argv) {
	
	BinaryNode* root=CreateBinaryTree();
	RecursionMiddle(root);
	//主函数负责调用 
	
	return 0;
}

先给一个简单的例子,如下是一个二叉树:

C++数据结构笔记(11)二叉树的#号创建法及计算叶子节点数_第3张图片

在录入结点时,先读入根结点1,然后是1的左节点2,然后是2的左节点3,由于3是叶子节点,则其左结点为#,然后是右节点,此处也为#;然后向上回溯,轮到2的右节点,此处为4,然后又轮到4的左右结点,均为#;然后是根结点1的右节点,为5,然后是5的左右结点,均为#,所以输入应该为:

1 2 3 # # 4 # # 5 # #

输入满足所有结点均有#号子节点时自动跳出递归,根据中序遍历的规则,上述的输出结果应该为:

3 2 4 1 5

C++数据结构笔记(11)二叉树的#号创建法及计算叶子节点数_第4张图片

如上是运行结果,与预期保持一致!


下图是一张对博主有深刻意义的二叉树图,因为这是一段藏头诗。为了防止大家在读入的时候出错,博主在此处给出读入顺序的答案:

 6 1 3 7 # # 7 # 7 # 1 # # 1 6 # # 1 3 # 9 # #

 运行代码并输入上述解码藏头诗的密钥,即可得出最浪漫的情话,这里就先保留悬念咯~

C++数据结构笔记(11)二叉树的#号创建法及计算叶子节点数_第5张图片

 

你可能感兴趣的:(数据结构,数据结构,c++)