文章目录
题目
二叉树的前序遍历:给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
一:借助栈实现
我们知道,先序遍历是按照 根左右
的顺序进行遍历的。即 根 左子树 右子树
我们知道栈的特点是后进先出。可以借助栈
来实现:
- 先把根节点入栈
- 栈不为空。弹出栈顶元素 A
- 栈顶元素 A 的右节点入栈(若不为空)
- 栈顶元素 A 的左节点入栈(若不为空)
- 重复上述操作直至栈为空
为什么要先右节点入栈,后再左节点入栈
呢?
因为栈的特点是,后进先出,先序遍历要求我们先遍历左子树,在遍历右子树。因此我们入栈的顺序需要相反,先把右子树入栈,再把左子树入栈。
时间复杂度
:访问每个节点恰好一次,时间复杂度为 O(N),其中 N 是节点的个数,也就是树的大小。
空间复杂度
:取决于树的结构,最坏情况存储整棵树(树的节点全部偏向一边),因此空间复杂度是 O(N)。
代码实现如下:
#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 PreOrder(TreeNode * root)
{
if (root == NULL)
{
return;
}
stack<TreeNode *> s;
s.push(root);
while(!s.empty())
{
TreeNode * temp = s.top();
s.pop();
cout << temp->data << " ";
if(temp->right != NULL)
{
s.push