简介
二叉树的遍历分为递归方式和非递归方式。
递归方式的空间复杂度为O(log(n))。
非递归方式中,通常用栈的方式,其空间复杂度为O(h),其中h为树的高度。
下面介绍一种空间复杂度为O(1)的前序遍历。
思路
既然是O(1)的空间复杂度,那就不能像传统方式将节点指针存入栈中,而是通过一个标志变量,来记录进入当前节点时,是从什么地方来的。
通过设置sign位的值来表示如何进入的这个节点,0代表从父节点进入,1代表从左子节点返回,2代表从右子节点返回
代码
#include <iostream>
#include <vector>
using namespace std;
struct Treenode
{
int val;
Treenode *father;
Treenode *lchild;
Treenode *rchild;
};
void create_tree(Treenode *p, vector<int> &temp, int t)
{
int length = temp.size();
if(t >= length)
{
return;
}
p->val = temp[t];
if(2*t+1 < length)
{
if(temp[2*t+1] != 0)
{
Treenode