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);
            }
        }
    }
    对于后序遍历,由于其访问序列为:左->右->根。因此还有一种方法,可以按类似前序遍历的方式:根->右->左,然后对得到的结果反序
    
  • 相关阅读:
    2019年Pycharm最新激活码_学生党适用
    Day14_分享昨天看到的一句话
    监督学习算法_k-近邻(kNN)分类算法_源代码
    Python学习需要安装的工具
    Python基础学习资料推荐
    总结一下公司项目使用各种较新的前端技术和 Api 的一些经验。
    由 Session 和 Cookie 的区别说起
    我理解的正确的代码
    回忆我是如何赢得一次踢毽子比赛
    日常的例子说明 throttle 和 debounce 的区别
  • 原文地址:https://www.cnblogs.com/myblog1993/p/11540437.html
Copyright © 2011-2022 走看看