zoukankan      html  css  js  c++  java
  • 先序构建二叉树及先序遍历二叉树

    /*先序为DLR(D:根节点,L:左子树,R:右子树)
                 a
               /    
              b    c
             /    /
            d  *  * e
    */
    //先序序列为abdce,输入为abd***c*e**(*表示空格,代表空树),输入按满二叉树输入

    //每一个节点都是一个子树的根节点

    void pre_create_tree(treenode **T){  //递归法
    	char datatemp;
    
    	fflush(stdin);
    	datatemp=getchar();
    
    	if(datatemp=='*'){
    		*T=NULL;
    	}
    	else{
    		if((*T=(treenode*)malloc(sizeof(treenode)))==NULL){
    			exit(0);
    		}
    		else{
    			(*T)->data=datatemp;
    			(*T)->lc = (*T)->rc = NULL;
    			pre_create_tree(&(*T)->lc);
    			pre_create_tree(&(*T)->rc);
    		}
    	}
    }
    
    void pre_visit_tree(treenode *T){  //递归法
    	if(T!=NULL){
    		printf("%c ", T->data);
    		pre_visit_tree(T->lc);
    		pre_visit_tree(T->rc);
    	}
    	else{
    		return;
    	}
    }
    
    struct stack_typedef{
    	treenode** stack_head;
    	treenode** stack_top;
    	int stack_used;
    };
    typedef struct stack_typedef stack;
    #define stack_max 1000
    void stack_init(stack *mystack){
    	if((mystack->stack_head=(treenode**)malloc(sizeof(treenode*)*stack_max))==NULL)
    		exit(0);
    	mystack->stack_used = 0;
    	mystack->stack_top = mystack->stack_head;
    }
    void stack_del(stack *mystack){
    	free(mystack->stack_head);
    }
    void stack_push(stack *mystack, treenode *data){	
    	if(mystack->stack_used<stack_max){
    		*(mystack->stack_top) = data;
    		mystack->stack_used ++;
    		mystack->stack_top ++;
    	}
    }
    treenode* stack_pop(stack *mystack){
    	if(mystack->stack_used>0){
    		mystack->stack_used--;
    		mystack->stack_top--;
    		return *mystack->stack_top;
    	}
    	return NULL;
    }
    
    void pre_visit_tree2(treenode *T){  //非递归法,需要使用栈保证输出正确,递归<=>栈
    	stack mystack;
    	stack_init(&mystack);
    	while(1){
    		printf("%c ", T->data);
    		if(T->lc!=NULL){	
    			stack_push(&mystack, T);
    			T=T->lc;
    		}
    		else if(T->rc!=NULL){
    			//stack_push(&mystack, T);
    			T=T->rc;
    		}
    		else{
    			//T=stack_pop(&mystack);
    			while(T->rc==NULL&&mystack.stack_used!=0){
    				T=stack_pop(&mystack);
    			}
    			if(T->rc!=NULL)
    				T=T->rc;
    			else
    				break;
    		}
    	};
    	printf("
    ");
    }


  • 相关阅读:
    软件工程评分表
    评论
    团队成员介绍
    第九天冲刺
    第八天冲刺
    第七天冲刺
    第六天冲刺
    第五天冲刺
    第四天冲刺
    第三天冲刺
  • 原文地址:https://www.cnblogs.com/xhyzjiji/p/6159392.html
Copyright © 2011-2022 走看看