二叉树?中序遍历
题目:
给定一个二叉树,返回它的中序 遍历
例子:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
题目分析
中序遍历:
- 左子树
- 根节点
- 右子树
递归三行解决
非递归? 栈 保存节点信息
解题思路
变量 | 作用 |
---|---|
stack<TreeNode*> s | 保存节点信息 |
TreeNode* temp | 表示当前访问节点 |
过程:
当s非空
取出栈顶元素作为当前节点 temp
栈顶元素出栈
如果当前节点的右子树节点非空 ==>入栈
(栈 先进后出 所以先将右子树节点入栈)
如果当前节点的左子树节点非空
==>
1.当前节点temp重新入栈(这样遍历完左子树的时候可以再遍历回根节点)
2.当前左子树的节点入栈
3.将当前节点的 左右子树置为空(再次遍历的时候就相当于没有左右子树 即根节点输出信息)
代码如下
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if (!root) return {};
stack<TreeNode*> s{{root}};
vector<int> ans;
while(!s.empty())
{
TreeNode* temp;
temp = s.top();
s.pop();
if (temp->right) s.push(temp->right); //右子树节点入栈
if (temp->left)
{
s.push(temp);
s.push(temp->left);
temp->left = NULL;
temp->right = NULL;
}
else ans.push_back(temp->val); //左子树节点为空则输出本节点信息
}
return ans;
}
};