1.二叉树前序非递归遍历
void PreOrder(BTNode *bt)
{
if(bt != NULL)
{
BTNode *Stack[maxSize];
int top = -1;
BTNode *p;
Stack[++top] = bt;
while(top != -1)
{
p = Stack[top--];
Visit(p);
if(p->rchild != NULL)
Stack[++top] = p->rchild;
if(p->lchild != NULL)
Stack[++top] = p->lchild;
}
}
}
2.二叉树中序非递归遍历
void inorder(BTNode *bt)
{ //开始根节点入栈
//如果栈顶结点左孩子存在,则左孩子入栈;
//如果栈顶结点左孩子不存在,则出栈并输出栈顶结点,然后检查其右孩子是否存在
//如果存在,则右孩子入栈
//栈空算法结束
if(bt != NULL)
{
BTNode *Stack[maxSize];
int top = -1;
BTNode *p;
p = bt;
while(top != -1 || p != NULL)
{
while(p != NULL)
{
Stack[++top] = p;
p = p->lchild;
}
if(top != -1) //在栈不空的情况下出栈并输出结点
{
p = Stack[top--];
Visit(p);
p = p->rchild;
}
}
}
}
3.二叉树后序非递归遍历
typedef struct
{
BTNode *t;
int tag;
}Stack;
void PostOrder(BTNode *bt)
{
Stack s[];
int top = -1;
while(bt != NULL && top != -1)
{
while(bt != NULL)
{
++top;
s[top].t = bt;
s[top].tag = 0;
bt = bt->lchild;
}
while(top != -1 && s[top].tag == 1)
{
Visit(s[top].t);
--top;
}
if(top != -1)
{
s[top].tag = 1;
bt = s[top].t->rchild;
}
}
}
4.打印值为x的结点的所有祖先,假设值为x的结点不多于一个
typedef struct
{
BTNode *t;
int tag;
}Stack;
void Search(BTNode *bt,int x)
{
Stack s[];
int top = -1;
while(bt != NULL && top != -1)
{
while(bt != NULL && bt->data != x)
{
++top;
s[top].t = bt;
s[top].tag = 0;
bt = bt->lchild;
}
if(bt->data == x)
{
printf("所查结点的所有祖先值为:\n");
for(i=0;i<top;i++)
{
printf("%d",s[i].t->data);
}
exit(0); //输出祖先值后结束
}
while(top != -1 && s[top].tag == 1)
{
--top;
}
if(top != -1)
{
s[top].tag = 1;
bt = s[top].t->rchild;
}
}
}
5.p和q的最近公共祖先结点r
BTNode* Ancestor(BTNode* root, BTNode* p, BTNode* q) {
//查找以root为根结点的树上是否有p结点或者q结点,如果有就返回p结点或q结点,否则返回null
if(root == p || root == q || root == NULL)
return root;
BTNode* left=Ancestor(root->lchild,p,q);
BTNode* right=Ancestor(root->rchild,p,q);
//第一种情况:左子树和右子树均找没有p结点或者q结点
if(left == NULL && right == NULL)
return NULL;
//第二种情况:左子树上能找到,但是右子树上找不到,此时就应当直接返回左子树的查找结果;
else if(left != NULL && right== NULL)
return left;
//第三种情况:右子树上能找到,但是左子树上找不到,此时就应当直接返回右子树的查找结果;
else if(right != NULL && left == NULL)
return right;
//第四种情况:左右子树上均能找到,说明此时的p结点和q结点分居root结点两侧,此时就应当直接返回root结点了
else
return root;
}