• 树的遍历(非递归中序遍历结点栈深度)


    树的结构

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    

    中序遍历

    1. 非递归遍历
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
            stack<TreeNode*> s;
            vector<int> ans;
            TreeNode* curr = root;
           	while(root || !s.empty()){
                while(root){
                    s.push(root);
                    root = root->left;
                }
                root = s.top();s.pop();
                cout << root->val << ednl;
                root = root->right;
            }
            return ans;
        }
    };
    
    1. 在之前的版本中加入记录第个结点的深度。

    思想:如果当前结点是右孩子,那么在这个结点之前加入一个nullptr占位,这样,栈深就是当前结点的深度了。。

    手动模拟下,可以发现中序遍历下保存的结点都是左孩子,而在当前结点的某一个祖先为右孩子时,它不会入栈。。所以使用一个空指针来占位。

    版权@djl orz

    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
            stack<TreeNode*> s;
            vector<int> ans;
            TreeNode* curr = root;
            int level = 0;
            bool flag = false;
            while(!s.empty() || curr){
                while(curr){
                    if(flag){
                        s.push(nullptr);
                    }
                    flag = false;
                    s.push(curr);
                    curr = curr->left;
                }
                do{
                    curr = s.top();s.pop();
                }while(!s.empty() && curr == nullptr);
                if(s.empty() && curr == nullptr){
                    break;
                }
                // cout << curr->val << endl;
                ans.push_back(curr->val);
                curr = curr->right;
                if(curr != nullptr)
                flag = true;
            }
            return ans;
        }
    };
    

    坑:前序,后序的非递归,以及保存深度下的做法(不一定会写)

  • 相关阅读:
    替换Srun3000解决掉网问题
    了解Equals所发生的事情
    WPF自定义TextBox及ScrollViewer
    自制多类编码转换工具
    .NET4.5之自制多LRC转SRT小工具
    JAVA_list总结
    记一次线程Timer导致的线程安全问题修正
    JAVA_匿名内部类
    JAVA_map总结
    JAVA_闭包
  • 原文地址:https://www.cnblogs.com/yvzhu/p/14170293.html
Copyright © 2020-2023  润新知