第4章第1節練習題7 交換二叉樹所有節點左右子樹

來源:互聯網
上載者:User

標籤:

問題描述

試編寫一演算法,實現將二叉樹中所有節點的左右子樹進行交換

演算法思想

因為需要實現將二叉樹中所有節點的左右子樹交換,因此最簡單的方式便是使用遞迴的方式。而完成整個樹左右子樹的交換,可以考慮兩種方式,從上向下依次交換,或從下往上依次交換。
從上向下:假如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 交換二叉樹所有節點左右子樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.