编写创建二叉树的算法

①、编写创建二叉树的算法;

②、编写查找节点的算法;

③、编写找孩子节点的算法;

④、编写求二叉树高度的算法;

⑤、编写输出二叉树的算法;

⑥、编写先序遍历递归算法;

⑦、编写主函数。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#define MaxSize 50
//①:
void CreateBTNode(BTNode * &b,char *str){  
   BTNode *St[MaxSize], *p=NULL;
   int top=-1,k,j=0;  
   char ch;
   b=NULL;				//建立的二叉树初始时为空
   ch=str[j];
   while (ch!='\0')  	      //str未扫描完时循环
   {  
	   switch(ch){
			case '(':
				top++;  St[top]=p;  k=1;  break;//为左孩子节点
			case ')':top--;break;
			case ',':k=2; break;  
         				//为孩子节点右节点
			default:
				p=(BTNode *)malloc(sizeof(BTNode));
				p->data=ch;p->lchild=p->rchild=NULL;
			if (b==NULL)    	//p为二叉树的根节点
				b=p;
			else{    		//已建立二叉树根节点
				switch(k) 
				{
	    			case 1:St[top]->lchild=p;break;
					case 2:St[top]->rchild=p;break;
				}
       }
     }
     j++;ch=str[j];
   }
}
//②:
BTNode *FindNode(BTNode *b,char 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);
   }
}

//③:
BTNode *LchildNode(BTNode *p){
      return p->lchild;
 }
  BTNode *RchildNode(BTNode *p){
      return p->rchild;
}
//④:
int BTNodeDepth(BTNode *b) 
{  int lchilddep,rchilddep;
   if (b==NULL) 
	   return(0); //空树的高度为0
   else{
	   lchilddep=BTNodeDepth(b->lchild); //求左子树的高度为lchilddep
  		rchilddep=BTNodeDepth(b->rchild); //求右子树的高度为rchilddep
		return (lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
   }
}

//⑤:
void DispBTNode(BTNode *b) 
{  if (b!=NULL)
   {  printf("%c",b->data);
	 if (b->lchild!=NULL || b->rchild!=NULL)
	 {  printf("(");
	    DispBTNode(b->lchild); //递归处理左子树
	    if (b->rchild!=NULL) printf(",");
	    DispBTNode(b->rchild); //递归处理右子树
	    printf(")");
	 }
   }
}
//⑥:
void PreOrder(BTNode *b){  
	if (b!=NULL){
		printf("%c ",b->data); //访问根节点
	    PreOrder(b->lchild);
	    PreOrder(b->rchild);
       }
  }
//⑦:
void main(){
	char str[] = "A(B(D(,G)),C(E,F))";
	BTNode *b;
	CreateBTNode(b,str);

	printf("输出二叉树:\n");
	printf("\n");
	DispBTNode(b);
	printf("\n");

	printf("二叉树的高度是:\n");
	int h = BTNodeDepth(b);
	printf("\n");
	printf("%d",h);
	printf("\n");

	printf("二叉树的左孩子:\n");
	BTNode *lchild  = LchildNode(b);
	printf("\n");
	DispBTNode(lchild);
	printf("\n");

	printf("二叉树的右孩子:\n");
	BTNode *rchild = RchildNode(b);
	printf("\n");
	DispBTNode(rchild);
	printf("\n");
	
	printf("查找“D”的二叉树节点:\n");
	BTNode *child = FindNode(b,'D');
	printf("\n");
	DispBTNode(child);
	printf("\n");


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值