67. 二叉树的中序遍历
描述
给出一棵二叉树,返回其中序遍历
样例
给出二叉树 {1,#,2,3}
,
1 \ 2 / 3
返回 [1,3,2]
题目链接:https://www.lintcode.com/problem/binary-tree-inorder-traversal/description
解题思路1:(递归)递归得到左子树的中序遍历的vector数组,把当前结点值添加进数组,再递归得到右子树中序遍历的vector数组,合并两个vector数组并返回。结点为NULL时即遍历到最底层,直接返回空的vector数组。
class Solution {
public:
/**
* @param root: A Tree
* @return: Inorder in ArrayList which contains node values.
*/
vector<int> inorderTraversal(TreeNode * root) {
// write your code here
vector<int> ans;
if(root == NULL)
return ans;
if(root->left != NULL){
vector<int> leftans = inorderTraversal(root->left);
ans.insert(ans.end(),leftans.begin(),leftans.end());
}
ans.push_back(root->val);
if(root->right != NULL){
vector<int> rightans = inorderTraversal(root->right);
ans.insert(ans.end(),rightans.begin(),rightans.end());
}
return ans;
}
};
解题思路2:(非递归)使用栈作为节点的存储结构,从root节点访问,首先把root节点压入栈,然后遍历栈,每次访问栈顶节点。如果节点的左节点非空,把左节点压入栈并把左节点标记为NULL,然后遍历下一个节点。如果左节点为空,则把当前节点放入vector数组,栈节点pop掉,再判断右节点,如果右节点非空,则把右节点压入栈并把右节点标记为NULL,遍历下一个节点。
class Solution {
public:
/**
* @param root: A Tree
* @return: Inorder in ArrayList which contains node values.
*/
vector<int> inorderTraversal(TreeNode * root) {
// write your code here
vector<int> ans;
if(root == NULL)
return ans;
stack <TreeNode*> st;
st.push(root);
while(st.size()>0){
TreeNode* cur = st.top();
if(cur->left != NULL){
st.push(cur->left);
cur -> left = NULL;
continue;
}
ans.push_back(cur->val);
st.pop();
if(cur->right != NULL){
st.push(cur->right);
cur -> right = NULL;
}
}
return ans;
}
};