水下功夫做透,水上才能顺风顺水。

二叉树的遍历

定义二叉树结点

typedef struct Node{                    
    struct Node *lchild;
    char data;    
    struct Node *rchild;
}BTNode;

 

//层次遍历 
void levelOrder(BTNode* root){
    if(root==NULL){
        return root;
    }
    Queue<BTNode*> queue = new Queue<>();                                                              
    in(queue,root); //根入队列    
   //一次循环出一个顶元素,出来的时候,把俩儿子(左在列前,右在列后)放进去。
    while(!isEmpty(queue)){                    
        BTNode*tmp = out(queue);                          
        printf("%c",tmp->data); 
        if(tmp->lchild!=NULL){                   
            in(queue,tmp->lchild);
        }
        if(tmp->rchild!=NULL){                 
            in(queue,tmp->rchild);
        }                                       
    }                                             
}

 

//先序递归遍历(即是深度优先遍历)
void preOrder(BTNode* root ){
    if(root!=NULL){                            
        printf("%c",root->data); //访问根节点
        preOrder(root->lchild); //递归,先序遍历左子树 
        preOrder(root->rchild); //递归,先序遍历右子树 
    }
}
//先序非递归遍历
void preOrder(BTNode* root) {
    if (root == null) {
        return;
    }
    Stack<BTNode*> stack = new Stack<>();
    add(root);//根入
    //一次出一个,出来的时候,把俩儿子(左在栈上,右在栈下)放进去。
    while (!isEmpty(queue)) {
        BTNode* tmp = pop(stack);
        printf("%c",tmp->data);
        if (tmp->rchild != null) { //右孩子压底备用
            push(stack,tmp->rchild);
        }
        if (tmp->lchild != null) {
            push(stack,tmp->lchild);
        }
    }
}

 

//中序递归遍历
void  middleOrder(BTNode * root){
    if(root!=NULL){                            
        middleOrder(root->lchild); //递归,中序遍历左子树 
        printf("%c",root->data); //访问根节点
        middleOrder(root->rchild); //递归,中序遍历右子树 
    }
} 

//中序非递归遍历
void middleOrder(BTNode* root) {
    if (root == null) {
        return;
    }
    Stack<TreeNode> stack = new Stack<>();
    TreeNode* tmp = root;
    while (tmp != NULL || !isEmpty(stack)) { 
        while (tmp != NULL) { //首次循环,左节点全部压入栈(左先)
            push(stack,tmp);
            tmp = tmp->lchild;
        }
        if (!isEmpty(stack)) {
            tmp = pop(stack); //首次循环,弹出最左边的节点
            printf("%c",tmp.data);
            tmp = tmp->rchild; //弹出左,顾其右(右为空,不压入,继续弹上左。)
        }
    }
} 

 

//后序递归遍历
void postOrder(BTNode * pBt){
    if(pBt!=NULL){
        postOrder(pBt->lchild);
        postOrder(pBt->rchild);
        printf("%c",pBt->data);
    }
}

//后序非递归遍历
void postOrder(BTNode* root) {
    if(root == null) {
        return;
    }
    Stack<BTNode*> stackTmp = new Stack<>();
    Stack<BTNode*> stackRes = new Stack<>();
    push(stackTmp,root);
    while (!isEmpty(stackTmp)) {
        BTNode* tmp = pop(stack1);
        push(stackRes,tmp); //将弹出的元素加到stackRes中,最后再输出。
        if (tmp->lchild != null) { //(左在临时栈下,右在临时栈上)
            push(stackTmp,tmp->lchild);
        }
        if (tmp->rchild != null) { 
            push(stackTmp,tmp->rchild);
        }
    }
    while (!isEmpty(stackRes)) {
       printf("%c",pop(stackRes)->data);
    }
}
posted @ 2020-03-01 16:58  北方寒士  阅读(151)  评论(0编辑  收藏  举报