题目
二叉树的中序遍历:给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
法一:借助栈
中序遍历: 左 根 右
我们可以借助栈来完成。我们知道左 跟 右,那就是要把左子树全部处理完了,即一直往左下一直走到头,然后在一层一层向上出来
- - - 再去处理根节点 - - - 再去处理右节点
具体思路:
- 根节点入栈 - - - 根节点的
所有左节点
依次入栈(这样的话,左节点依次全部入栈,出栈的时候就是从最下面的左节点开始的) - 弹出栈顶元素。
- 栈顶元素
若存在右节点,则右节点入栈
------右节点的所有左节点依次入栈
- 若栈顶元素不存在右节点,则继续执行上述操作(即弹出栈顶元素)
- 栈顶元素
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stack>
using namespace std;
struct TreeNode
{
int data;
TreeNode * left;
TreeNode * right;
TreeNode(int value)
{
data = value;
left = NULL;
right = NULL;
}
};
/*
中序遍历: 左 根 右
借助栈来完成。我们知道左 跟 右,那就是要把左子树全部处理完了--再去处理根节点---再去处理右节点
根节点入栈---根节点的所有左节点依次入栈(这样的话,左节点依次全部入栈,出栈的时候就是从最下面的左节点开始的)
弹出栈顶元素。若栈顶元素存在右节点,则右节点入栈------右节点的所有左节点依次入栈
若栈顶元素不存在右节点,则继续执行上述操作(即弹出栈顶元素)
*/
void InOrder(TreeNode * root)
{
if(root == NULL)
{
return;
}
stack<TreeNode *> s;
while(root)
{
s.push(root);
root = root->left; // 往左子树上一直走到头
}
while(!s.empty())
{
TreeNode * temp = s.top();
s.pop();
cout << temp-