题目
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[1,2]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
分析
递归法
判断给的指针是否为NULL,非空的话先输出自己,然后调用自己的左子树,最后调用自己的右子树。
C
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define MAXSIZE 100 /* 存储空间初始分配量 */
typedef int TElemType; /* 树结点的数据类型,目前暂定为整型 */
typedef struct node
{
TElemType data;
struct node * lchild, * rchild;//左右孩纸指针
}BTree;
void CreatTree(BTree** T)//构造二叉树
{
TElemType n = 0;
scanf("%d", &n);
if(999 != n)
{
(*T) = (BTree*)malloc(sizeof(BTree));
assert(NULL != *T);
(*T)->data = n;
CreatTree(&((*T)->lchild));
CreatTree(&((*T)->rchild));
}
else
{
*T = NULL;
}
}
//先序遍历 递归法
void preorderTraversalRecursion(BTree* T)
{
if(NULL == T)
{
return ;
}
printf("%d ", T->data); //先输出
preorderTraversalRecursion(T->lchild);//再向左子树走
preorderTraversalRecursion(T->rchild);//最后向右子树走
}
int main()
{
BTree* root = NULL;
CreatTree(&root);
printf("递归的先序输出:\t");
preorderTraversalRecursion(root);
printf("\n");
return 0;
}
迭代法(栈)
用一个栈来存储每次遇到的节点,先一直向左子树节点遍历,并保存到栈中。若为NULL时,从栈中取出最近一次遍历过的节点,然后访问该节点的右子树节点,若再为NULL,就再从栈中取出。
C
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define MAXSIZE 100 /* 存储空间初始分配量 */
typedef int TElemType; /* 树结点的数据类型,目前暂定为整型 */
typedef struct node
{
TElemType data;
struct node * lchild, * rchild;//左右孩纸指针
}BTree;
void CreatTree(BTree** T)//构造二叉树
{
TElemType n = 0;
scanf("%d", &n);
if(999 != n)
{
(*T) = (BTree*)malloc(sizeof(BTree));
assert(NULL != *T);
(*T)->data = n;
CreatTree(&((*T)->lchild));
CreatTree(&((*T)->rchild));
}
else
{
*T = NULL;
}
}
//先序输出 非递归法 栈
void preorderTraversalnoRecursion(BTree* T)
{
assert(T != NULL);
BTree* n[MAXSIZE] = { 0 };//0下标不存数据
n[0] = NULL;
int i = 0;
while(T != NULL || i > 0)
{
while(T != NULL)
{
printf("%d ", T->data);
i++;
n[i] = T;
T = T->lchild;
}
T = n[i];
i--;
T = T->rchild;
}
}
int main()
{
BTree* root = NULL;
CreatTree(&root);
printf("非递归的先序输出:\t");
preorderTraversalnoRecursion(root);
printf("\n");
return 0;
}
本章完!