標籤:
問題描述
試編寫一演算法,實現將二叉樹中所有節點的左右子樹進行交換
演算法思想
因為需要實現將二叉樹中所有節點的左右子樹交換,因此最簡單的方式便是使用遞迴的方式。而完成整個樹左右子樹的交換,可以考慮兩種方式,從上向下依次交換,或從下往上依次交換。
從上向下:假如T為整棵樹的根節點,則首先交換T的左右孩子,然後交換T的左孩子(註:此時T的左孩子為原來二叉樹中T的右孩子)的左右孩子,依次類推,當T的左子樹交換完成後,再接著交換T的右孩子(註:此處同理,T的右孩子為原來二叉樹中T的左孩子)的左右孩子,依次類推完成整棵樹的左右子樹交換。
從下往上:首先交換整棵樹中最左邊的兩個葉子節點,然後接著交換次左邊的兩個葉子節點,接著將最左邊的兩個葉子節點父節點與次左邊的兩個葉子節點的父節點進行交換,依次類推,直到交換到根節點為止。
為了保證結果的正確性,利用先序遍曆和中序遍曆可以唯一確定一個二叉樹的特點,同時列印出先序遍曆結果和中序遍曆結果以保證結果可靠性。
演算法描述
從上向下的交換的過程有點類似於先序遍曆的過程,因此使用先序遞迴遍曆的方式實現
void SwapLRtreePre(BiTNode* T){ BiTNode* temp; if(T==NULL){ return; } temp=T->lchild; T->lchild=T->rchild; T->rchild=temp; SwapLRtreePre(T->lchild); SwapLRtreePre(T->rchild);}
從下往上的交換過程有點類似於後序遍曆的過程,因此使用後序遞迴遍曆的方式實現
void SwapLRtreePost(BiTNode* T){ BiTNode* temp; if(T==NULL){ return; } SwapLRtreePost(T->lchild); SwapLRtreePost(T->rchild); temp=T->lchild; T->lchild=T->rchild; T->rchild=temp;}
附件
//AB#DG###CE##F###include<stdio.h>#include<stdlib.h>typedef char ElemType;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;BiTNode* CreateBiTree(BiTNode*);void SwapLRtreePre(BiTNode*);void SwapLRtreePost(BiTNode*);void PreOrder(BiTNode*);void InOrder(BiTNode*);void Jundge(BiTNode*);//----------------------------------------------------------int main(int argc, char* argv[]){ BiTNode* T=(BiTNode*)malloc(sizeof(BiTNode)); T=CreateBiTree(T); Jundge(T); SwapLRtreePre(T); Jundge(T); Jundge(T); SwapLRtreePost(T); Jundge(T); return 0;}BiTNode* CreateBiTree(BiTNode* T){ ElemType x; scanf("%c",&x); if(x==‘#‘){ return NULL; } T=(BiTNode*)malloc(sizeof(BiTNode)); T->data=x; T->lchild=CreateBiTree(T->lchild); T->rchild=CreateBiTree(T->rchild); return T;}//----------------------------------------------------------//以“先序遍曆”的思想交換左右子樹void SwapLRtreePre(BiTNode* T){ BiTNode* temp; if(T==NULL){ return; } temp=T->lchild; T->lchild=T->rchild; T->rchild=temp; SwapLRtreePre(T->lchild); SwapLRtreePre(T->rchild);}//以“後序遍曆”的思想交換左右子樹void SwapLRtreePost(BiTNode* T){ BiTNode* temp; if(T==NULL){ return; } SwapLRtreePost(T->lchild); SwapLRtreePost(T->rchild); temp=T->lchild; T->lchild=T->rchild; T->rchild=temp;}//----------------------------------------------------------void Jundge(BiTNode* T){ printf("---------------\n"); PreOrder(T); printf("\n"); InOrder(T); printf("\n");}void PreOrder(BiTNode* T){ if(T==NULL){ return; } printf("%c",T->data); PreOrder(T->lchild); PreOrder(T->rchild);}void InOrder(BiTNode* T){ if(T==NULL){ return; } InOrder(T->lchild); printf("%c",T->data); InOrder(T->rchild);}
第4章第1節練習題7 交換二叉樹所有節點左右子樹