LeetCode题目详解——Binary Tree Inorder Traversal
题目:
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
中序遍历和先序遍历有很多相似的地方,只是在访问的顺序上有一点不太一样。非递归的遍历同样分为使用栈和不使用栈的方式。
一、使用栈
class Solution { public: vector<int> inorderTraversal(TreeNode *root) { stack<TreeNode*> rest; vector<int> result; rest.push(root); TreeNode *cur; if(root == NULL) return result; cur=root; while(!rest.empty() || cur) { while (cur) { rest.push(cur); cur = cur->left; } if(!rest.empty()) { cur = rest.top(); result.push_back(cur->val); rest.pop(); cur=cur->right; } } return result; } };
二、不使用栈
不使用栈的方法即morris方法,利用改变树的结构,来记录接下来需要访问的节点。morris方法的先序遍历和中序遍历很相似,只有一句代码的位置不一样。对于morris方法不太了解的同学可以参考的前一篇文章:LeetCode题目详解——Binary
Tree Preorder Traversal 代码如下:
class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> result; TreeNode *p=root; if(!root) return result; while(p) { if(p->left==NULL) { result.push_back(p->val); p=p->right; } else { TreeNode *tmp=p->left; while(tmp->right && tmp->right!=p) { tmp=tmp->right; } if(tmp->right==NULL) { tmp->right=p; p=p->left; } else { result.push_back(p->val);//只有这句代码的位置和先序遍历的时候不太一样 tmp->right=NULL; p=p->right; } } } return result; } };
最后更新:2017-04-03 05:39:57