关于二叉树的其他操作

本文介绍了二叉树的两种重要操作:输出叶子结点及求树高度,并提供了对应的代码实现。此外,还提及了未来可能探讨的问题,如寻找二叉树中两个节点的最低共同父节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于二叉树,最重要的操作是遍历,在之前介绍的遍历的基础上,关于二叉树可以延伸出各种对于二叉树的其他操作,下面就为大家介绍

1.输出二叉树的叶子结点

只需要在之前前序遍历的基础上增加检测结点的“左右子树是否都为空”。

 //输出二叉树的叶子结点
 void PreOderPrintLeaves(Ptree BT){
	 if(BT)    
	 {   if(!BT->lchild&&!BT->rchild)//检测结点的“左右子树是否都为空”
             printf("%c",BT->data);    
         preOrder(BT->lchild);    
         preOrder(BT->rchild);    
     }   
 };

2.求二叉树的高度

利用了后序遍历的代码,具体实现代码如下

//求二叉树的高度
 int PostOrderGetHeight(Ptree BT){
	 int HL,HR,MaxH;
	 if(BT){
		 HL= PostOrderGetHeight(BT->lchild);
		 HR= PostOrderGetHeight(BT->rchild);
		 MaxH=(HL>HR)?HL:HR;
		 return (MaxH+1);
	 }
	 else return 0;
 };
暂时先按照这两个搞,举个例子,还是上面博客中的例子

                   A

       B                  C

D         F      G           I

         E             H

执行结果如下图


完整的程序代码如下

#include "stdio.h"    
#include "stdlib.h"      
typedef struct tree  
{    
    char data;    
    struct tree *lchild;    
    struct tree *rchild;    
 }*Ptree;   

//树的建立  
Ptree createTree();
//先序遍历    
void preOrder(Ptree t);
//中序遍历    
void intOrder(Ptree t);
//后序遍历   
void postOrder(Ptree t);  

//输出二叉树的叶子结点
void PreOderPrintLeaves(Ptree BT);
 //求二叉树的高度
 int PostOrderGetHeight(Ptree BT);
  
  
void main()    
{     
   Ptree t;   
   printf("先序创建二叉树,用空格代表虚结点:\n");  
   t=createTree();   
   printf("前序遍历:");  
   preOrder(t) ;  
   printf("\n");  
   printf("中序遍历:");  
   intOrder(t);  
   printf("\n");  
   printf("后序遍历:");    
   postOrder(t);    
   printf("\n");

   printf("输出二叉树的叶子结点:");    
   PreOderPrintLeaves(t);    
   printf("\n");

   printf("求二叉树的高度:");    
   printf("%d",PostOrderGetHeight(t));    
   printf("\n");


   system("pause");  
}  


Ptree createTree()   //树的建立  
 {    
     char ch;    
     Ptree t;    
     ch=getchar();  //输入二叉树数据  
     if(ch==' ')  //判断二叉树是否为空  
         t=NULL;    
     else   
     {    
         t=(Ptree)malloc(sizeof(Ptree));  //二叉树的生成  
         t->data=ch;    
         t->lchild=createTree();    
         t->rchild=createTree();    
     }    
     return t;    
 }    
   
 void preOrder(Ptree t)  //先序遍历   
 {    
     if(t)    
     {      
         printf("%c",t->data);    
         preOrder(t->lchild);    
         preOrder(t->rchild);    
     }    
 }    
   
 void intOrder(Ptree t)  //中序遍历    
{    
    if(t)    
     {    
        intOrder(t->lchild);    
        printf("%c",t->data);    
        intOrder(t->rchild);    
     }    
 }    
   
 void postOrder(Ptree t)  //后序遍历    
 {    
     if(t)    
     {       
         postOrder(t->lchild);    
         postOrder(t->rchild);   
         printf("%c",t->data);    
     }    
 }

 //输出二叉树的叶子结点
 void PreOderPrintLeaves(Ptree BT){
	 if(BT)    
	 {   if(!BT->lchild&&!BT->rchild)//检测结点的“左右子树是否都为空”
	         {printf("%c",BT->data);}    
         PreOderPrintLeaves(BT->lchild);    
         PreOderPrintLeaves(BT->rchild);    
     }   
 };

 //求二叉树的高度
 int PostOrderGetHeight(Ptree BT){
	 int HL,HR,MaxH;
	 if(BT){
		 HL= PostOrderGetHeight(BT->lchild);
		 HR= PostOrderGetHeight(BT->rchild);
		 MaxH=(HL>HR)?HL:HR;
		 return (MaxH+1);
	 }
	 else return 0;
 };
还有一些操作我今后有时间的时候会慢慢放上来的,比如说

输入二叉树中的两个节点,输出这两个结点在树中最低的共同父节点。
思路:遍历二叉树,找到一条从根节点开始到目的节点的路径,然后在两条路径上查找共同的父节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉风小宇

请我喝个咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值