二叉树基本算法(建树,查找,查找孩子节点,交换左右子树,求树高,求叶子节点和总节点,打印二叉树)

运行截图:
二叉排序树

#include <stdio.h>
#include <stdlib.h> 
#define maxsize 100 
typedef struct BTNode
{
int data;
BTNode *lchild;
BTNode *rchild; 
}BTNode;
//建树 
BTNode*CreateBTNode(char *str)
{
 BTNode *r=NULL;      //建立二叉树初始值为空
 BTNode *st[maxsize];
 BTNode *p;
 int top=-1,k=0,j=0;  //top栈顶指针,j遍历字符串,k标记左右孩子,1为左孩子 
 char ch;              //输入的字符
 while(str[j]!='\0')
  {
     ch=str[j];
     switch(ch)
     {
        case'(':top++;st[top]=p;k=1;break;
        case')':top--;break;
        case ',':k=2;break;
        default:
        p=(BTNode*)malloc(sizeof(BTNode));
        p->lchild=p->rchild=NULL;
        p->data=ch;
        if(r==NULL)
           r=p;       //p为根节点 
        else
        {
            switch(k)
            {
                case 1:st[top]->lchild=p;break;
                case 2:st[top]->rchild=p;break;
                default:break;
            }
        }
        break;
     }  
     j++;   //循环遍历字符串str 
  } 
  return r;
}
//打印字符串 ,递归先序遍历 
void DispBTNode1(BTNode *t)
{
 if(t!=NULL)
 {
  printf("%c",t->data);
  DispBTNode1(t->lchild);
  DispBTNode1(t->rchild);
 }
}
//查找节点
   BTNode *FindNode(BTNode *b,int x)
   {
   	BTNode *p;
   	if(b==NULL)
   	return NULL;
   	else if (b->data==x)
   	return b;
   	else{
   		p=FindNode(b->lchild,x);
   		if(p!=NULL)
   		return p;
   		else
   		return FindNode(b->rchild,x);
	   }
	} 
   //计算叶子节点数目,所有节点数目 
int LeafNodes(BTNode *b)
   {
   	int num1,num2;
   	if(b==NULL)
   	return 0;
   	else if (b->lchild==NULL&&b->rchild==NULL)
	   return 1;
	   else
	   {
	   	num1=LeafNodes(b->lchild);
	   	num2=LeafNodes(b->rchild);
	   	return (num1+num2);
	   	//return (num1+num2+1)  //返回所有节点 
		} 
	} 
	//查找左右孩子节点
	   BTNode *LchildNode(BTNode *t)
	   {
	   	
	   	if(t->lchild!=NULL){
		   
	   	   printf("左孩子节点:%c\n",t->lchild->data);
	   	   return t->lchild; 
	   }else{
	   	printf("该节点的左孩子为空\n"); 
	   }
		} 
		  BTNode *RchildNode(BTNode *t)
	   {
	   	    if(t->rchild!=NULL){
			   
	   	     printf("右孩子节点:%c\n",t->rchild->data);
	   	     return t->rchild;
	   	 }else{
	   	 	printf("该节点的右孩子为空\n");
			}
		} 
		//求树高度,深度
		 int  BTNodeDepth(BTNode *t)
		  {
		  	int lchildDepth,rchildDepth;
		  	if(t==NULL)
		  	return 0;
		  	else
		  	{
		  		lchildDepth=BTNodeDepth(t->lchild);
		  		rchildDepth=BTNodeDepth(t->rchild);
		  		return (lchildDepth>rchildDepth)? (lchildDepth+1):(rchildDepth+1);
			  }
		   } 
		
		//交换左右子树
BTNode *swap(BTNode *b)
	{
		BTNode *t,*t1,*t2;
		if(b==NULL)
		t=NULL;
		else{
			t=(BTNode *)malloc(sizeof(BTNode));
			t->data=b->data;
			t1=swap(b->lchild);  //交换左子树 
			t2=swap(b->rchild);  //交换右子树 
			t->lchild=t2;
			t->rchild=t1;
		}
		return t; 
	 }
int main()
{
  // char *str="A(B(D,F(,E)),C(G(,H),I))";
   BTNode *T,*S,*M;
   	char *str="A(B(D(,G)),C(E,F))"; 
    BTNode *bt=CreateBTNode(str);
    DispBTNode1(bt);
    	printf("\n计算叶子节点数目:%d",LeafNodes(bt));
		  printf("\n打印交换左右子树后的二叉树\n"); 
		  T=swap(bt);		
		  DispBTNode1(T); 
//	     printf("查找节点:\n");
//		  M=FindNode(bt,3);              //有点问题 
//		  printf("%c",M->data);
    	printf("\n查找根节点左孩子节点:\n"); 
      S=LchildNode(bt);
     	printf("查找根右节点的右孩子节点:\n"); 
     	RchildNode(bt->rchild);
  	printf("查找根左节点的右孩子节点:\n"); 
        RchildNode(S);
     	printf("求树的高度:%d\n", BTNodeDepth(bt));
		
	return 0;
}
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值