使用迭代法遍历二叉树

需要用到栈

题目不用看直接写思路

对于先序:

首先把跟结点放到栈里面

然后开始while,退出条件为栈不为空

把根节点对应的val放到数组result中,

然后把top给pop掉

if()如果root->right不为空 push到栈中

if()如果root->left不为空 push到栈中

循环结束后return一个result

注意这里是栈,所以我们先把righr放进入,然后再放left

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();                       // 中
            st.pop();
            result.push_back(node->val);
            if (node->right) st.push(node->right);           // 右(空节点不入栈)
            if (node->left) st.push(node->left);             // 左(空节点不入栈)
        }
        return result;
    }
};

然后是后序:

思路大致一样,就是把if左右的顺序改一下,最后把数组顺序调换

reverse函数调换顺序

最后是中序

循环的判断条件分别为,cur != NULL || 栈不为空

里面有两条路,一条是直接往左走走到底,还有一条是else

找到栈位置后判断右边的路,最后pop掉

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while (cur != NULL || !st.empty()) {
            if (cur != NULL) { // 指针来访问节点,访问到最底层
                st.push(cur); // 将访问的节点放进栈
                cur = cur->left;                // 左
            } else {
                cur = st.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据)
                st.pop();
                result.push_back(cur->val);     // 中
                cur = cur->right;               // 右
            }
        }
        return result;
    }
};
05-05 20:01