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

树的结构

/**
 * 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;
    }
};

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

posted @ 2020-12-21 21:51  yvzhu  阅读(189)  评论(0编辑  收藏  举报