1. 程式人生 > >二叉樹的遍歷應用2

二叉樹的遍歷應用2

遞迴演算法刪除二叉樹所有葉結點

若二叉樹為空,返回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;
}