非递归形式遍历二叉树

最简单的就是前序遍历,每次将栈顶元素插入数组中。
但要注意由于栈的性质,先push右节点再push左节点。

点击查看代码
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
vector<int>v;
stack<TreeNode*>stk;
if(root!=NULL){stk.push(root);}
while(!stk.empty()){
    TreeNode*p=stk.top();
   v.push_back(p->val);
    stk.pop();
    if(p->right){stk.push(p->right);}
    if(p->left){stk.push(p->left);}
   
}
return v;
    }
};
后序遍历,只要改动这一点,先push左节点再push右节点,这时候的顺序就是根右左,将数组reverse就是左右根了。 稍微复杂的就是中序遍历,因为它访问顺序与数组插入顺序不同,要换一种方法。 循环终止条件就是遍历指针为空同时栈为空, 遍历指针为空,就不断向栈中加入左子树,不为空就向数组插入堆顶元素,然后遍历指针换成右子树。
点击查看代码
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
vector<int>v;
stack<TreeNode*>stk;
TreeNode*p=root;
while(p!=NULL||!stk.empty()){
    if(p!=NULL){
        stk.push(p);
        p=p->left;
    }
    else{
        p=stk.top();
        v.push_back(p->val);
        stk.pop();
        p=p->right;
    }
}
return v;
    }
};
posted @ 2024-01-15 12:15  yun-che  阅读(23)  评论(0)    收藏  举报