二叉樹的遍歷應用2
阿新 • • 發佈:2018-12-22
遞迴演算法刪除二叉樹所有葉結點
若二叉樹為空,返回NULL;
若二叉樹只有一個結點,直接刪除;
否則遞迴左右子樹。
void Del(BiTNode *&t)
{
if(t==NULL) return;
if(t->lcild==NULL&&t->rchild==NULL)
{
delete t;
t=NULL;
}
else
{
Del(t->lchild);
Del(t->rchild);
}
}
遞迴演算法求二叉樹各結點元素最大值
設max是預先設定的最大值,初始值為0,判斷是否有比其更大的值並修改。
void MaxValue(BiTNode *t,DataType &max) { if(t!=NULL) { if(t->data>max) { max=t->data; } MaxValue(t->lchild,max); MaxValue(t->rchild,max); } }
由於遞迴語句中,由函式引數表返回最大值,故max為引用型引數。
遞迴演算法交換二叉樹的左右子女
先對左子樹和右子樹進行遞迴調換,最後交換根的左右子女
void exchange(BiTNode *t)
{
if(t==NULL) return;
exchange(t->lchild);
exchange(t->rchild);
BiTNode *p;
p=t->lchild;
t->lchild=t->rchild;
t->child=p;
}
由前序序列和中序序列構造二叉樹
設前序序列pre[s1,…,t2],中序序列in[s2,…,t2],初始時s1=s2=0,t1=t2=n;以pre[s1]建立根節點,搜尋in[s1]=pre[s1]的位置i,把中序序列分為in[s2,…i-1]和in[i+1,…t2]兩個子序列,再遞迴構造左右子樹。
void createBiTree(BiTNode *t,DataType pre[], DataType in[], int s1,int s2,int t1,int t2) {//pre存放前序序列,in存放中序序列 int i; t = (BiTNode*)malloc(sizeof(BiTNode)); t->data = pre[s1]; //前序序列的第一個元素一定是根節點 for(i=s2; i<t2; i++) { if(in[i]==pre[s1]) break; } //使用遞迴,分別插入左子樹和右子樹 createBiTree(t->lchild,pre,in,s1+1,s1+i-s2,s2,i-1); createBiTree(t->rchild,pre,in,s1+i-s2+1,t1,i+1,t2); }
由後序序列和中序序列構造二叉樹
與由前序序列和中序序列構造二叉樹類似,不過根結點為post[t1],即後序序列的最後一位
void createBiTree(BiTNode *t,DataType post[], DataType in[], int s1,int s2,int t1,int t2)
{
int i;
t = (BiTNode*)malloc(sizeof(BiTNode));
t->data = post[t1]; //後序序列的最後一個元素一定是根節點
for(i=s2; i<t2; i++)
{
if(in[i]==post[t1])
break;
}
//使用遞迴,分別插入左子樹和右子樹
createBiTree(t->lchild,pre,in,s1+i-s2,t1-1,i+1,t2);
createBiTree(t->rchild,pre,in,s1,s1+i-s2-1,s2,i-1);
}
用前序遍歷求前序遍歷的第k個結點
加入計數器count,在訪問的同時記錄結點序號
BiTNode* Pre_Find_k(BiTNode t,int &count,int k)
{
if(t!==NULL)
{
count++;
if(count==k) return t;
BiTNode *p;
p=(BiTNode*)malloc(sizeof(BiTNode));
if((p=Pre_Find_k(t->lchild,count,k))!=NULL) return p;
else return (Pre_Find_k(t->rchild,count,k));
}
else return NULL;
}