zoukankan      html  css  js  c++  java
  • 二叉树前中后、层次遍历

    #include<iostream>
    #include<stack>
    #include<queue>
    using namespace std;
    
    /*
    二叉树遍历算法递归+非递归:
    前序遍历:根->左->右
    中序遍历:左->根->右
    后序遍历:左->右->根
    层次遍历
    */
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x): val(x),left(NULL),right(NULL) {}
    };
    
    /*递归版本*/
    void prerecusive(TreeNode *root)
    {
        if (!root) return;
        cout << root->val << " ";
        prerecusive(root->left);
        prerecusive(root->right);
    }
    void inrecusive(TreeNode *root)
    {
        if (!root) return;
        inrecusive(root->left);
        cout << root->val << " ";
        inrecusive(root->right);
    }
    void postrecusive(TreeNode *root)
    {
        if (!root) return;
        postrecusive(root->left);
        postrecusive(root->right);
        cout << root->val << " ";
    }
    
    /*循环版本。栈做辅助*/
    void preiteration(TreeNode *root)
    {
        if (!root) return;
        stack<TreeNode *> s;
        s.push(root);
        while (!s.empty())
        {
         TreeNode *curr=s.top(); cout
    << curr->val << " "; s.pop(); if (curr->right) s.push(curr->right); if (curr->left) s.push(curr->left); } } void initeration(TreeNode *root) { if (!root) return; stack<TreeNode *> s; TreeNode *curr = root; while (curr || !s.empty())//s没有值,第一个判断条件是curr不是空 { if (curr) { s.push(curr); curr = curr->left; } else { cout << s.top()->val << " "; curr = s.top()->right; s.pop(); } } } void postiteration(TreeNode *root) { if (!root) return; stack<TreeNode *> s; s.push(root); TreeNode *curr; TreeNode *visited;//记录子节点已经访问过 while (!s.empty()) { curr = s.top(); /* * 出栈条件: * 对于叶子节点:直接弹出 * 对于非叶子节点:如果已经遍历过其左子节点或右子节点,则弹出 */ if ((!curr->left && !curr->right) || (visited && (curr->left==visited || curr->right == visited))) { cout << curr->val << " "; visited = curr; s.pop(); } else { if (curr->right) s.push(curr->right); if (curr->left) s.push(curr->left); } } } void leveltraverse(TreeNode *root) { if (!root) return; queue<TreeNode *> q; TreeNode *curr; q.push(root); while (!q.empty()) { curr = q.front(); cout << curr->val << " "; q.pop(); if (curr->left) q.push(curr->left); if (curr->right) q.push(curr->right); } }
  • 相关阅读:
    XPOSED优秀模块列表 Xposed GEL 设置
    XPOSED优秀模块列表 Eggster
    XPOSED优秀模块列表 全部成为F
    XPOSED优秀模块列表 XBridge
    XPOSED优秀模块列表 xBoon
    XPOSED优秀模块列表 定位注入器
    showModalDialog()、showModelessDialog()方法使用详解
    手工更改数据库字符集
    blog开张了
    SQLSERVER 2008 复制之旅
  • 原文地址:https://www.cnblogs.com/beixiaobei/p/10914253.html
Copyright © 2011-2022 走看看