zoukankan      html  css  js  c++  java
  • 数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    #include<malloc.h>
    #define null 0
    using namespace std;
    typedef struct node 
    {
    	int data;//节点 
    	node *lchild,*rchild;
    }node,*Tree;
    typedef struct{
    	Tree top, base;
    }Stack;
    int sum0,sum1,sum2,Height;
    Stack s;
    void getstack(Stack &s)//构造一个空栈 
    {
    	s.base = (Tree)malloc(100*sizeof(node));
    	s.top = s.base;
    }
    
    int stackempty(Stack s)//判断栈是否为空 
    {
    	if(s.top==s.base)
    	return 0;
    	else
    	return 1;
    }
    void push(Stack &s, Tree e){//压栈 
    	*s.top++ = *e;
    }
    void gettree(Tree &T)//创建二叉树 
    {
    	int point;
    	scanf("%d",&point);
    	if(point==null)
    	   T=NULL;
    	else
    	{
    		T=(Tree)malloc(sizeof(node));
    		T->data=point;
    		gettree(T->lchild);
    		gettree(T->rchild); 
    	}
    }
    void output(int e){
    	printf("%d ",e);
    }
    void PreOrderTraverse(Tree T)//先序遍历 
    {
    	if(T)
    	{
    		printf("%d ",T->data);
    		PreOrderTraverse(T->lchild);
    		PreOrderTraverse(T->rchild);
    	}
    } 
    void InOrderTraverse(Tree T)//中序遍历 
    {
    	 getstack(s); 
    	 Tree p=T;
    	 Tree Q=(Tree)malloc(sizeof(node));
    	 while(p||stackempty(s))
    	 {
    	 	if(p)
    	 	{
    	 		push(s,p);
    	 		p=p->lchild;
    	 	}
    	 	else
    	 	{
    	 		*Q = *--s.top;
    	 		output(Q->data);
    	 		p=Q->rchild;
    	 	}
    	 }
    }
    void Degree(Tree T)//求度数分别为0  1  2的结点个数 
    {
    	if(T==NULL)
    	    return ;
    	else
    	{
    		if(T->lchild&&T->rchild)
    		        sum2++;
    		else if((T->lchild&&!T->rchild)||(!T->lchild&&T->rchild))
    		        sum1++;
    		else if(!T->lchild&&!T->rchild)
    		       sum0++;
    		Degree(T->lchild);
    	    Degree(T->rchild);
    	}
    }
    int High(Tree T)//求树高 
    {
    	if(T==NULL)
    	    return 0;
    	int num1=High(T->lchild);
    	int num2=High(T->rchild);
    	return max(num1,num2)+1;
    }
    void PostOrderTraverse(Tree T)//后序遍历 
    {
    	if(T)
    	{
    		PostOrderTraverse(T->lchild);
            PostOrderTraverse(T->rchild);
            printf("%d ",T->data);
    	}
    }
    void checkTree(Tree T)//遍历整个树 
    {
    	Degree(T);
    	Height=High(T);
    }
    int main()
    {                  
    	Tree T;
    	printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0
    ");
    	gettree(T);
    	printf("先序递归遍历二叉树:
    ");
    	PreOrderTraverse(T);
    	printf("
    ");
        printf("中序递归遍历二叉树:
    ");
        InOrderTraverse(T);
        printf("
    ");
        printf("后序递归遍历二叉树:
    ");
        PostOrderTraverse(T);
        printf("
    
    ");
        sum1=sum0=sum2=0;
        checkTree(T);
        printf("这棵树中度为0的结点个数为%d
    
    ",sum0);
        printf("这棵树中度为1的结点个数为%d
    
    ",sum1);
        printf("这棵树中度为2的结点个数为%d
    
    ",sum2);
        printf("这棵树的高度为%d
    ",Height);
    	return 0;
    }
    

      

  • 相关阅读:
    oracle数据库的乱码问题解决方案
    @HTML.checkboxFor()用法
    存储过程实现登录(.net)
    .net中大数据的处理
    xml总结
    获取指定日期是当前月的第几周
    JS中正则方法的使用
    获取指定日期的前一天日期
    通过Oracle函数实现.NET String.Format函数的简单版
    ReportViewer实现多语言
  • 原文地址:https://www.cnblogs.com/tonghao/p/5001435.html
Copyright © 2011-2022 走看看