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;
    }
    
  • 相关阅读:
    《Programming WPF》翻译 第8章 1.动画基础
    一些被遗忘的设计模式
    《Programming WPF》翻译 第4章 数据绑定
    《Programming WPF》翻译 第3章 控件
    《Programming WPF》翻译 第5章 样式和控件模板
    《Programming WPF》翻译 第7章 绘图
    《Programming WPF》翻译 第9章 自定义控件
    《Programming WPF》翻译 第7章 绘图 (2)
    《Programming WPF》翻译 第8章 前言
    关于Debug和Release之本质区别
  • 原文地址:https://www.cnblogs.com/yusuph/p/14043973.html
Copyright © 2011-2022 走看看