您的位置:首页 > 其它

Leetcode#144 Binary Tree Preorder Traversal

2015-01-29 10:51 375 查看
原题地址

递归代码谁都会,当然是写非递归代码了。

最基本的写法是用一个特殊栈同时保存节点以及节点的左孩子、右孩子是否遍历过。这种思路比较简单,跟递归写法一样很好理解。前序、中序、后序的遍历写法类似。

还有一种更"屌"的写法,只需要使用普通栈即可,不需要保存左孩子、右孩子是否遍历过。基本思路是:

1. 只要当前节点还有左孩子,就一直压栈下去,直到没有左孩子了

2. 从栈顶依次弹栈,直到找到一个有右孩子的节点,返回1

对于前序和中序,无非是在1中访问节点的值,还是在2中访问节点的值罢了。

对于后序就没法这么做了,不过也有"屌"的写法,可以参考这篇文章

代码:

vector<int> preorderTraversal(TreeNode *root) {
vector<int> res;
stack<TreeNode *> st;
TreeNode *node = NULL;

node = root;
while (node) {
while (node) {
res.push_back(node->val);
st.push(node);
node = node->left;
}
node = NULL;
while (!st.empty() && !node) {
node = st.top()->right;
st.pop();
}
}

return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: