zoukankan      html  css  js  c++  java
  • 树的非递归遍历

    Reference:浙大数据结构慕课

    1、非递归中序遍历

    1)定义一个栈。

    2)一直向左节点访问,将访问到的节点入栈,直到节点为空。

    3)栈顶pop出一个节点,指针指向其右节点,重复上述过程。

    code:

     1 bool inOrder(TreeNode *root) {
     2     stack<TreeNode *> s;
     3          
     4     while (root || !s.empty()) {
     5         while (root) {
     6             s.push(root);
     7             root = root->left;
     8         }
     9         root = s.top();
    10         s.pop();
    11         cout << root->val; //中序
    12         root = root->right;
    13     }
    14     return valid;
    15 }

    注意循环结束的判断条件不能只是 !s.empty(),因为当pop出根节点后,root指向根节点的右节点,此时栈为空。

    也不能只是root,因为当pop出某节点,且此节点无右节点时,root为空。

    2、前序遍历

    只需把访问节点的位置改一下,其余和中序遍历相同:

    code:

     1 bool isValidBST(TreeNode *root) {
     2     stack<TreeNode *> s;
     3          
     4     while (root || !s.empty()) {
     5         while (root) {
     6             cout << root->val; //前序遍历
     7             s.push(root);
     8             root = root->left;
     9         }
    10         root = s.top();
    11         s.pop();
    12         root = root->right;
    13     }
    14     return valid;
    15 }

    3、后序遍历

    未完待续。。。

  • 相关阅读:
    wap学习记录
    vue router
    webpack 之 缓存处理
    webpack 之 plugin
    webpack 之 loader
    babel实践
    webpack 之 webpack-dev-server自动刷新
    webpack之source map
    vue笔记
    《高性能网站建设指南》笔记
  • 原文地址:https://www.cnblogs.com/lxc1910/p/12628752.html
Copyright © 2011-2022 走看看