InOrderTraversal BiTree
前面两篇写了先序和后续遍历二叉树,LeetCode上面有同样的题,本以为应该也会有一个中序遍历,但上面没有,所以给补上了。
Given a binary tree, return the inorder 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?
中序遍历,递归方法:void InOrderTraversal(BiTree *root)
{
if(!root)
return;
InOrderTraversal(root->lchild);
cout<<root->data<<endl;
InOrderTraversal(root->rchild);
}
非递归遍历:
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int>output;
vector<TreeNode*>storage;
output.clear();
storage.clear();
if (root == NULL)
{
return output;
}
TreeNode* temp = root;
while (temp!= NULL || storage.size() > 0)
{
while (temp != NULL)
{
storage.push_back(temp);
temp = temp->left;
}
if (storage.size() > 0)
{
temp = storage.back();
output.push_back(temp->val);
storage.pop_back();
temp = temp->right;
}
}
return output;
}
};
主要有:
(1)如果空树直接返回。
(2)将根节点赋值给临时节点。
(3)进入循环,如果节点为空,或者是临时存储栈为空则跳出主循环。
(4)循环内,首先将根节点压入到临时存储栈,然后是其左孩子,然后是左孩子的左孩子,一直遍历到最左叶子节点。
(5)取栈顶节点,将该节点的值压入结果栈,POP出该节点,并将该节点的右孩子赋值临时节点。
(6)直到temp为空,并且临时存储为空则跳出循环输出结果。