本篇主要来实现二叉树的遍历
1.递归实现
三种递归遍历的方式 本质上压栈顺序是相同的。 printf位置决定访问顺序。
(即遍历一次二叉树时,一个结点有三次访问的机会,printf的位置决定哪一次访问)
//先序遍历
void preOrderTraverase(TreeNode *t)
{
if(t)
{
printf("%d",t->_data);
preOrderTraverase(t->_left);
preOrderTraverase(t->_right);
}
}
//中序遍历
void midOrderTraverase(TreeNode *t)
{
if(t)
{
midOrderTraverase(t->_left);
printf("%d",t->_data);
midOrderTraverase(t->_right);
}
}
//后续遍历
void postOrderTraverase(TreeNode *t)
{
if(t)
{
postOrderTraverase(t->_left);
postOrderTraverase(t->_right);
printf("%d",t->_data);
}
}
2.循环实现
非递归的遍历 借用栈来实现。
先序和中序遍历,首先将root根节点入栈,一路向左,遇空pop,向右重生。
//先序
void preStackTree(TreeNode *r)
{
if(r)
{
Stack s;
initStack(&s,1000);
printf("pretraverse Tree: ");
while(r || !isStackEmpty(&s))
{
while(r)
{
printf("%d",r->_data);
push(&s,r);
r = r->_left;
}
if(!isStackEmpty(&s))
{
r = pop(&s);
r = r->_right;
}
}
putchar(10);
}
}
//中序
void midStackTree(TreeNode *r)
{
if(r)
{
Stack s;
initStack(&s,1000);
printf("midtraverse Tree: ");
while(r || !isStackEmpty(&s))
{
while(r)
{
push(&s,r);
r = r->_left;
}
if(!isStackEmpty(&s))
{
r = pop(&s);
printf("%d",r->_data);
r = r->_right;
}
}
putchar(10);
}
}
//****************************
//hou'xu后续遍历
void postStackTree(TreeNode *t)
{
Stack s;
initStack(&s,100);
TreeNode *cur; //当前结点
TreeNode *pre=NULL; //前一次访问的结点
push(&s,t);
while(!isStackEmpty(&s))
{
cur = pop(&s);
push(&s,cur);
if((cur->_left==NULL&&cur->_right==NULL)||
(pre!=NULL&&(pre==cur->_left||pre==cur->_right)))
{
//如果当前结点没有孩子结点或者孩子节点都已被访问过
printf("%d ",cur->_data);
pop(&s);
pre=cur;
}
else
{
if(cur->_right != NULL)
push(&s,cur->_right);
if(cur->_left != NULL)
push(&s,cur->_left);
}
}
}
3.层序遍历
层序遍历借用队列,先进先出。
根节点入队,进入循环。结点出队,孩子入队,先左后右。
void LevelorderTraverse(TreeNode *t)
{
Queue q;
initQueue(&q);
enQueue(&q,root);
while(!isQueueEmpty(&q))
{
TreeNode * t = deQueue(&q);
printf("%c\n",t->data);
if(t->left)
enQueue(&q,t->left);
if(t->right)
enQueue(&q,t->right);
}
}
4.递归法求二叉树深度
递归,就是老母猪戴胸罩——一套又一套。(强行文学范?)
"老母猪戴胸罩——一套又一套"这一歇后语比喻讲话做事系统性很强,连贯而富有逻辑,引经据典,充满学识。也有说比喻做人不真诚,为了达到目的,使用一个又一个的套路。
递归求深度的思想:把一棵大树left…left…分解到最小树,求最小数的深度,再选取深度较大值 一层一层的往上扩充。——灵魂解释……
int getHeightByPostOrder(TreeNode * t)
{
int lH, rH, maxH;
if(t)
{
lH = getHeightByPostOrder(t->_left);
rH = getHeightByPostOrder(t->_right);
maxH = (lH>rH)?lH:rH;
return maxH +1;
}
else
return 0;
}