二叉树遍历算法的应用

先序遍历的顺序建立二叉链表

【算法步骤】
①扫描字符序列,读入字符ch
②如果ch是一个“#”字符,则表明该二叉树为空树,即 T 为NULL;否则执行以下操作:

  • 申请一个结点空间 T
  • 将 ch 赋给T->data
  • 递归创建T的左子树
  • 递归创建T的右子树

【算法描述】

void CreateBiTree(BiTree &T)
{
	cin >> ch;
	if(ch=='#') T=NULL; //递归结束,建空树 
	else
	{
		T=new BiTNode; //生成根结点 
		//或T=(BiTNode*)malloc(sizeof(BiTNode));
		T->data=ch;    //根结点数据域置为ch 
		CreateBiTree(T->lchild); //递归创建左子树 
		CreateBiTree(T->rchild); //递归创建右子树 
	}
 } 

复制二叉树

【算法步骤】
如果是空树,递归结束,否则执行以下操作:

  • 申请一个新结点空间,复制根结点
  • 递归复制左子树
  • 递归复制右子树

【算法描述】

void Copy(BiTree T,BiTree &newT)
{
 	if(T==NULL)   //如果是空树,递归结束 
 	{
 		newT=NULL;
 		return;
	}
	else
	{
		NewT=new BiTNode;
		NewT->data=T->data;  //复制根结点 
		Copy(T->lchild,NewT->lchild); //递归复制左子树 
		Copy(T->rchild,NewT->rchild); //递归复制右子树 
	}
} 

计算二叉树的深度

【算法步骤】
如果是空树,递归结束,深度为0,否则执行以下操作:

  • 递归计算左子树的深度记为m
  • 递归计算左子树的深度记为n
  • 如果 m 大于 n,二叉树的深度为 m+1,否则为 n+1

【算法描述】

int Depth(BiTree T)
{
	if(T==NULL) return 0;   //空树,深度为0,递归结束 
	else
	{
		m=Depth(T->lchild); //递归计算左子树的深度记为m 
		n=Depth(T->rchild); //递归计算右子树的深度记为n 
		if(m>n) return (m+1);//二叉树的深度为m与n的较大者加1 
		else return (n+1);
	}
 } 

统计二叉树中结点的个数

【算法描述】

int NodeCount(BiTree T)
{
	if(T==NULL) return 0;  //空树,则结点个数为0,递归结束 
	else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
	//结点个数为左子树的结点个数+右子树的结点个数+1 
 } 

计算二叉树叶子结点数

【算法描述】

int LeadCount(BiTree T)
{
	if(T==NULL) return 0; //空树返回0 
	if(T->lchild==NULL && T->rchild==NULL)
	  return 1;           //叶子结点返回1 
	else
	  return LeadCount(T->lchild)+LeadCount(T->rchild);  
 } 

借鉴:《数据结构》严蔚敏

扫描二维码关注公众号,回复: 8979974 查看本文章
发布了33 篇原创文章 · 获赞 81 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wmy0217_/article/details/104174501