數據結構(四)樹---樹的轉換

(一)樹轉二叉樹

步驟

1.加線:在全部兄弟結點之間加一條連線 2.去線:對樹中每一個結點,只保留他與第一個長子結點的連線,刪除他與其餘孩子結點之間的連線 3.層次調整。以樹的根節點爲軸心,將整棵樹順時針旋轉必定角度,使結構井井有條。 注意:第一個孩子是二叉樹結點的左孩子,兄弟轉換過來的孩子是結點的右孩子
轉換後,根節點只有左子樹,最左側鏈表不改變

(二)森林轉二叉樹

步驟

1.將每一個樹轉換爲二叉樹 2.第一棵二叉樹不動,從第二棵二叉樹開始,依次吧後一棵二叉樹的根節點做爲前一棵二叉樹的根節點的右子樹,用線鏈接起來。當全部的二叉樹鏈接起來,就獲得了由森林轉換而來的二叉樹

(三)二叉樹轉換爲樹

 

步驟

1.若某結點的左孩子存在,則將該左孩子的右孩子結點,以及該左孩子的右孩子的右孩子結點,以及...,就是左孩子的n個右孩子結點都做爲此結點的孩子。將該結點與這些右孩子結點用線鏈接 2.去線:刪除原二叉樹中全部結點與其右孩子結點的連線

(四)二叉樹轉森林

咱們從一:知道樹轉二叉樹只有左子樹,森林轉二叉樹會同時存在左子樹和右子樹
因此判斷一棵樹可以轉換爲一棵樹仍是一個森林,就看這個二叉樹的根節點有沒有右孩子

步驟

1.從根節點開始,如果右孩子存在,將右鏈拆開,全部的右孩子連線都刪除。獲得分離的二叉樹。
2.再將每棵分離後的二叉樹轉換爲樹便可

(五)樹的遍歷

法一:先根遍歷

先根遍歷樹,即先訪問樹的根節點,而後依次先根遍歷根的每棵子樹(相似於先序遍歷)

法二:後根遍歷

後根遍歷,即先依次後根遍歷每棵子樹,而後再訪問根節點。(相似於後序遍歷)

(六)森林的遍歷

法一:前序遍歷

先訪問森林的第一棵樹的根節點,而後依次先根遍歷....,再依次用一樣方法遍歷下一棵樹....

法二:後序遍歷

先訪問森林的第一棵樹的根節點,而後依次後根遍歷....,再依次用一樣方法遍歷下一棵樹....

(七)總結

樹,森林的前根(序)遍歷和二叉樹的前序遍歷結果相同,樹,森林的後根(序)遍歷和二叉樹的中序遍歷結果相同
能夠根據(一)和(二)輕鬆推出結論,而後利用這種規律,解決這些複雜的樹,森林遍歷問題

(八)代碼實現:建立樹,實現樹轉換二叉樹,利用二叉樹打印出樹的結果

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h>
 typedef char TElemType;//樹的孩子兄弟表示法結構定義
typedef struct TNode    //結點結構
{ TElemType data; //結點數據
    struct TNode *lchild, *rsibling;    //左孩子,右兄弟指針
}TNode, *Tree; //二叉樹的二叉鏈表結點結構定義
typedef struct BiTNode    //結點結構
{ TElemType data; //結點數據
    struct BiTNode *lchild, *rchild;    //左右孩子指針
}BiTNode, *BiTree; //使用孩子兄弟法建立一棵樹 //建立一棵樹ABDG#H#I###CEJ##F####
void createTree(Tree *T) { TElemType ch; scanf("%c", &ch); if (ch == '#') *T = NULL; else { *T = (Tree)malloc(sizeof(TNode)); (*T)->data = ch; createTree(&(*T)->lchild);    //構造左孩子
        createTree(&(*T)->rsibling);//構造右兄弟
 } } void Tree2BiTree(Tree T,BiTree *BT) { if (T) { *BT = (BiTree)malloc(sizeof(BiTNode)); (*BT)->data = T->data; Tree2BiTree(T->lchild, &(*BT)->lchild);  //利用對應的結點來構造二叉樹 Tree2BiTree(T->rsibling, &(*BT)->rchild); } else
        *BT = NULL; } //傳入的是轉換爲二叉樹的樹
void PreOrderTraverseForTree(BiTree BT) { if (BT) { printf("%c", BT->data); PreOrderTraverseForTree(BT->lchild); PreOrderTraverseForTree(BT->rchild); } } int main() { Tree T; BiTree BT; createTree(&T); Tree2BiTree(T,&BT); PreOrderTraverseForTree(BT); system("pause"); return 0; }

注:森林能夠由樹的鏈表構成