嗨~ 答应你们的非递归遍历来咯
首先嘛 先序(前序)的打印顺序是 根左右 的
中序 打印顺序是 左根右
所有对于
递归 代码就很简单
void print3(struct node*root)
{
if(root!=NULL)
{
printf("%d\t",root->data); //打印 (根)
print3(root->left); //传节点左边 (左)
print3(root->right); //传节点右边 (右)
}
}
递归就是反复的调用自己代码哼简单 但是理解就有点。。。。
非递归 理解很容易
//先序遍历 非递归
void print2(struct node*root)
{
struct node*a[20]; //建立一个结构体数组
struct node*pnode=root; //然后定义一个结构体指针好做下面的操作
int i=-1; // 定义一个 结构体数组的下标 让i=-1是为了 给下面操作做铺垫
while(pnode||i!=-1)
{
while(pnode) //当节点不为空
{
a[++i]=pnode; // 入栈 为什么是++i 因为i刚开始是=-1
printf("%d\t",pnode->data);
pnode=pnode->left;// 向它左边走
}
if(i!=-1) // 无路可走的时候
{
pnode=a[i--]; //出栈
pnode=pnode->right;// 向右边走
}
}
}
非递归就是出栈入栈的问题
- 50这个节点 入栈 在 打印 然后 向左 走到30这个节点
- 30这个节点 入栈 在 打印 然后 向左 走到20这个节点
- 20这个节点 入栈 在 打印 然后 向左 走到黑色(空)节点
- 空节点就 出栈 到 20这个节点
- 在判断20这个节点的右子树为空嘛? 空 出栈 不为空 向右走在重复 入栈,打印,向左