zoukankan      html  css  js  c++  java
  • 二叉树遍历

    前序遍历:根->左->右
    中序遍历:左->根->右
    后序遍历:左->右->根
    假设树节点的定义如下:
    
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    递归版
    //前序遍历
    void preorderTraversalRecursion(TreeNode *node)
    {
        if(!node) return;
        cout << node->val << " ";//操作当前节点
        preorderTraversalRecursion(node->left);
        preorderTraversalRecursion(node->right);
    }
    
    //中序遍历
    void inorderTraversalRecursion(TreeNode *node)
    {
        if(!node) return;
        inorderTraversalRecursion(node->left);
        cout << node->val << " ";//操作当前节点
        inorderTraversalRecursion(node->right);
    }
    
    //后序遍历
    void postorderTraversalRecursion(TreeNode *node)
    {
        if(!node) return;
        postorderTraversalRecursion(node->left);
        postorderTraversalRecursion(node->right);
        cout << node->val << " ";//操作当前节点
    }
    迭代版
    需要使用一个栈作为辅助空间
    
    //前序遍历
    void preorderTraversalIteration(TreeNode *root)
    {
        stack<TreeNode*> st;
        if(root)
            st.push(root);
    
        while(!st.empty()){
            TreeNode *nd = st.top();
            st.pop();
    
            cout << nd->val << " ";//操作当前节点
    
            if(nd->right)
                st.push(nd->right);
            if(nd->left)
                st.push(nd->left);
        }
    }
    
    //中序遍历:
    void inorderTraversalIteration(TreeNode *root)
    {
        stack<TreeNode*> st;
    
        TreeNode *curr = root;
    
        while(curr || !st.empty()){
            if(curr){
                st.push(curr);
                curr = curr->left;
            }
            else{
                curr = st.top();
                st.pop();
    
                cout << curr->val << " ";//操作当前节点
    
                curr = curr->right;
            }
        }
    }
    
    //后序遍历
    void postorderTraversalIteration(TreeNode *root)
    {
        stack<TreeNode*> st;
        TreeNode *pre;
    
        if(root)
            st.push(root);
    
        while(!st.empty()){
            TreeNode *nd = st.top();
            /*
             * 出栈条件:
             * 对于叶子节点:直接弹出
             * 对于非叶子节点:如果已经遍历过其左子节点或右子节点,则弹出
             */
            if((!nd->left && !nd->right) || (pre && (nd->left == pre || nd->right == pre))){
                st.pop();
                cout << nd->val <<" ";//操作当前节点
                pre = nd;
            }
            else{//说明是一个非叶子节点,并且还未访问其左右孩子
                if(nd->right)
                    st.push(nd->right);
                if(nd->left)
                    st.push(nd->left);
            }
        }
    }
    对于后序遍历,由于其访问序列为:左->右->根。因此还有一种方法,可以按类似前序遍历的方式:根->右->左,然后对得到的结果反序
    
  • 相关阅读:
    python 的class和def 定义执行语句相关
    python _和__ 下划线命名规则
    python2和python3编码问题【encode和decode】
    cpython源码阅读
    eCPRI
    python内存管理/垃圾回收
    Class() vs self.__class__()
    JAVA学习日报 11/24
    JAVA学习日报 11/23
    JAVA学习日报 11/22
  • 原文地址:https://www.cnblogs.com/myblog1993/p/11540437.html
Copyright © 2011-2022 走看看