zoukankan      html  css  js  c++  java
  • 树和二叉树2——输出广义表形式(带括号)二叉树

    二叉树的基本运算如下(显示的结果):
    (1)创建二叉树
    (2)输出二叉树:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)) (3)H 结点:左孩子为 J 右孩子为 K
    (4)二叉树 bt 的高度:7
    (5)释放二叉树 bt

    如何输出带括号二叉树?
    这里用的是根结点和其他结点递归函数分离的方式完成的,
    即在pre_order_traveral_brackets()中运行遍历根结点及其左右孩子,然后在pre_order_traveral_brackets1()遍历其他子结点

    完整代码如下

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct BiTNode{
    	char data;
    	struct BiTNode *lchild,*rchild;
    }BiTNode,*BiTree;
    
    int init(BiTree &t)//存在的意义并不大 
    {
    	t=NULL;
    	return 1;
    }
    
    int BiTreedestroy(BiTree &t)
    {
    	if(t)
    	{
    		if(t->lchild)
    			BiTreedestroy(t->lchild);
    		if(t->rchild)
    			BiTreedestroy(t->rchild);
    		free(t);
    		t=NULL;
    	}
    	return 1;
    }
    
    void BiTreecreate(BiTree &t)
    {
    	char ch;
    	char pch[]="ABD$$EHJ$$KL$$M$N$$$CF$$G$I$$";
    	static int i=0;
    	ch=pch[i++];
    	
    	if(ch=='$')
    	t=NULL;
    	else 
    	{
    		t=(BiTree)malloc(sizeof(BiTNode));
    		if(!t)   exit(-1);
    		t->data=ch;
    		BiTreecreate(t->lchild);
    		BiTreecreate(t->rchild); 
    	}
    }
    
    
    void pre_order_traveral(BiTree t)
    {
    	if(t)
    	{
    		printf("%c ",t->data);
    		pre_order_traveral(t->lchild);
    		pre_order_traveral(t->rchild);
    	}
    }
    
    int flag=1; 
    void pre_order_traveral_brackets1(BiTree t)
    {  //A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) 
    	if(t)
    	{
    		printf("%c",t->data);
    		if(t->lchild||t->rchild)
    		{
    			printf("(");flag++;
    		}		
    		pre_order_traveral_brackets1(t->lchild);
    		if(t->rchild)
    		//if(t->lchild||t->rchild)这个用来判断的是有(A,)的情况
    		//输出案例没有关于“有左子树没右子树的”显示需求,故不用,但用这条语句会更合理些 
    		printf(",");
    		pre_order_traveral_brackets1(t->rchild);
    	}
    }
    void pre_order_traveral_brackets(BiTree t)
    {  //A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) 
    	if(t)
    	{
    		printf("%c",t->data);
    		//if(t->lchild||t->rchild)  
    		printf("(");
    		pre_order_traveral_brackets1(t->lchild);
    		while(--flag)
    		{
    			printf(")");
    		}
    		//if(t->lchild)
    		printf(",");
    		pre_order_traveral_brackets1(t->rchild);
    		while(flag--+1)
    		{
    			printf(")");
    		}
    	}
    }
    
    int max(int a,int b)
    {
    	return a>b?a:b;
    }
    int BiTreedeep(BiTree t)
    {
    	if(t==NULL)
    	return 0;
    	else
    	{
    		if(t->lchild==NULL&&t->rchild==NULL)
    			return 1;
    		else
    			return 1+max(BiTreedeep(t->lchild),BiTreedeep(t->rchild));
    			
    	}
    }
    
    int main(){
    
    	BiTree binarytree;
    	if(init(binarytree))
    	printf("创建二叉树成功
    "); 
    	BiTreecreate(binarytree);
    	
    	printf("输出二叉树:");
    	pre_order_traveral_brackets(binarytree);
    
    	printf("
    二叉树 bt 的高度: %d
    ",BiTreedeep(binarytree));
    	
    	if(BiTreedestroy(binarytree))
    	printf("释放二叉树成功"); 
    }
    
    
  • 相关阅读:
    Android 面试题及答案(2)
    Android 框架学习之 第一天 okhttp & Retrofit
    Gui系统之View体系(2)---View的setContent
    Android 高级面试题及答案
    Android 热修复技术(1)---原理
    android 事件分发机制
    android Gui系统之WMS(2)----窗口的添加
    在腾讯实习的那段日子:不要在难受的时候选择逃避离开
    全国女人都当妓女的古代神秘国(转载)
    MongoDB(索引及C#如何操作MongoDB)(转载)
  • 原文地址:https://www.cnblogs.com/vivid-victory/p/10090457.html
Copyright © 2011-2022 走看看