zoukankan      html  css  js  c++  java
  • 二叉树的创建及其遍历

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Bintree
    {
    	char info;
    	struct Bintree *lchild,*rchild;
    };
    typedef struct Bintree *BinTreeNode;
    
    typedef struct Node *PNode;//栈的存储结构
    struct Node
    {
    	BinTreeNode c;
    	PNode link;
    };
    
    struct LinkStack//链接栈类型定义
    {
      PNode  top;//指向栈顶元素
    };
    typedef struct LinkStack *PLStack;//链接栈类型定的指针类型
    
    PLStack Cstack()//创建空栈
    {
    	PLStack plstack;
        plstack=(PLStack)malloc(sizeof(PLStack));
        if(plstack!=NULL) plstack->top=NULL;
        else printf("out of space") ;
        return plstack;
    }
    
    int isemptystack(PLStack plstack) //判断是否是空栈
    {
    	return (plstack->top==NULL);
    }
    
    void push(PLStack plstack, BinTreeNode x) //进栈运算
    	{
    		PNode  p;
        	p=(PNode)malloc(sizeof(struct Node));
        	if(p==NULL)
        	 printf("out of space");
        	else
    		{
    			p->c=x;
        		p->link=plstack->top;
      			plstack->top=p;
    
      		}
    	}
    
    void pop (PLStack plstack)//出栈运算
    {
    
        	PNode p;
        	if(isemptystack(plstack))
      		 //判断栈是否为空,空栈不进行任何操作,
       		//否则出栈运算,修改指针
       		  printf("Empty stack pop.
    ");
        else
        {
      		p=plstack->top;
      		printf("%c",p->c->info);
       		plstack->top=plstack->top->link;
      		free(p);
        }
    }
    
    BinTreeNode top(PLStack plstack)//取栈顶元素
    {
    	if(plstack->top==NULL)//判断栈顶是否空栈
        printf("Stack is Empty");
        else
    	{
    		return (plstack->top->c);
    	}
    }
    
    BinTreeNode  CBintree()
    {
    	char c;
    	BinTreeNode p;
    	scanf("%c",&c);
    	getchar();
    	if(c!='#')
    		{
    			p=(BinTreeNode)malloc(sizeof(BinTreeNode));
    			p->info=c;
    			p->lchild=CBintree();
    			p->rchild=CBintree();
    		}
    	else
    		p=NULL;
    		return p;
    }
    
    void npreOreder(BinTreeNode t)
    //先根次序次序周游
    {
    	PLStack s;
    	BinTreeNode c;
    	if(t==NULL)  return;
    	s=Cstack();
    	push(s,t);
    	while(!isemptystack(s))
    	{
    		c=top(s);pop(s);
    		if(c!=NULL)
    		{
    
    			if(c->rchild!=NULL) push(s,c->rchild);
    			if(c->lchild!=NULL) push(s,c->lchild);
    		 }
    	}
    }
    
    void ninOder(BinTreeNode t)
    //中根次序周游
    {
    	PLStack s=Cstack();
    	BinTreeNode c=t;
    	if(c==NULL)	return;
    	do{
    		while(c!=NULL){push(s,c);c=c->lchild;	}
    		c=top(s);pop(s);c=c->rchild;
    	}while(c!=NULL||!isemptystack(s));
     }
    
    void npostOrder(BinTreeNode t)
    {
    	PLStack s=Cstack();
    	BinTreeNode p=t;
    	while(p!=NULL||!isemptystack(s))
    	{
    		while(p!=NULL){
    		push(s,p) ;
    		p=p->lchild?p->lchild:p->rchild;
    		}
    		p=top(s);	pop(s);
    
    		if(!isemptystack(s)&&top(s)->lchild==p)
    			p=top(s)->rchild;
    		else	p=NULL;
    	}
    
    }
    int dfs_Tree(BinTreeNode t,int a){
    	if(t==NULL){
    	    return a;
    	}
    	if(t->lchild!=NULL)return dfs_Tree(t->lchild,a+1);
    	if(t->rchild!=NULL)return dfs_Tree(t->rchild,a+1);
    	return a;
    
    }
    int main()
    {
    	BinTreeNode root=(BinTreeNode)malloc(sizeof(BinTreeNode));
    	root=CBintree();
    	printf("先根");		npreOreder(root);
    	printf("中根");		ninOder(root);
    	printf("后根");		npostOrder(root);
    
    	printf("
    %d",dfs_Tree(root,1));
    	return 0;
    }
    
  • 相关阅读:
    MySQL
    关于多因子选股模型的常见问题
    T100 GR 报表常见知识点 (含套版制作)
    Oracle Round 函式 (四捨五入)
    Oracle的字串處理
    改變帳款性質別以利排序沖帳才不會有問題,把19->17,把12->17
    財務月結結帳相關檢核程式
    t100 常用公用變數
    一、自动驾驶行业概述(第一课,新认识)
    第一章 软件体系结构概论
  • 原文地址:https://www.cnblogs.com/yusuph/p/14043973.html
Copyright © 2011-2022 走看看