C C 實現樹形結構之二叉樹

2021-08-28 06:06:57 字數 1872 閱讀 8140

樹的概念

樹形結構是一類非常重要的非線性資料結構,樹中節點的位置具有明確的層次關係。並且結點之間有分支,非常類似於真正的樹。而我們這裡著重講述的是二叉樹。

二叉樹是樹形結構的一種重要的型別,在實際應用中有著非常重要的作用和意義。二叉樹是n個節點的有限集合,他的每個節點至多只有兩棵子樹。當然也可以是空集。或者是由乙個根節點及兩棵互不相交的分別成為這個根的左子樹和右子樹的二叉樹組成。

從以上概念中,我們可以看出,樹的定義是遞迴的。根據這個定義我們也可以匯出二叉樹的五種形態(1)空二叉樹 (2)僅有根節點 (3)只有左子樹 (4)只有右子樹 (5)既有左子樹又有右子樹。

二叉樹的概念

性質1:

在二叉樹的第i層上至多有2^(i-1)個節點

性質2:

深度為k的二叉樹至多有2^k-1個結點(k>=1)

性質3:

對任何一棵二叉樹t,若其終端結點數為n0,度數為2的結點數為n2,則n0=n2+1

性質四可以從前面的性質中推出。可以自己嘗試下。

二叉樹的邏輯結構

二叉樹的邏輯結構為:一共三個域,其中乙個指向它的左孩子的根結點,另乙個指向它右孩子的根結點。資料域儲存資料。

typedef struct node  bintnode;

typedef bintnode * bintree;

根據廣義表生成二叉樹

這段**是利用了廣義表來建立乙個樹的。該演算法稍微簡單一些,但是要求用廣義表表示二叉樹的理解要深刻。它與普通的表示二叉樹的廣義表形式有些不同,因為他有左右子樹之分。括號左邊的結點是在左子樹上,括號右邊的結點是在右子樹上。

演算法中使用了乙個指標陣列來模擬棧的儲存結點的雙親指標,根據讀入廣義表中的字元分四種不同情況來處理。

bintnode* createtree(const char* str)

}} j++;

chr= str[j];

} return b;

}

按完全二叉樹的層次順序依次輸入結點資訊建立二叉鍊錶的演算法

該演算法的基本思想是:首先對一般的二叉樹新增若干個虛結點,使其成為完全二叉樹。然後依次的輸入節點的資訊。若輸入的節點資訊不是虛結點』@『,則建立乙個新結點。若為第乙個結點,則為根節點。否則將新節點作為左孩子或者是右孩子鏈結到它的雙親結點上。如此重複,直到遇到結束符號』#『

//按照完全二叉樹的層次順序建立二叉鍊錶

bintree createbintree(bintree bt)

rear++;

q[rear] = s;

if (rear == 1)bt = s;

else

else q[front]->rchild = s;

}if (rear % 2 != 0)front++;

} ch = getchar();

} return bt;

}

遞迴實現的遍歷演算法
//前序遍歷演算法

void preorder(bintree bt)

}//中序遍歷演算法

void midorder(bintree bt)

}//後序遍歷演算法

void postorder(bintree bt)

}

非遞迴實現的遍歷演算法
void inorder1(bintree bt)

top = top - 1;

if (top >= 0)

} while (top != -1);

}

資料結構之二叉樹實現

1.二叉樹的原理分析 樹是一種重要的非線性資料結構,直觀地看,它是資料元素 在樹中稱為結點 按分支關係組織起來的結構。二叉樹 binary tree 是每個節點最多有兩個子樹的有序樹。通常子樹被稱作 左子樹 和 右子樹 二叉樹演算法的排序規則 1 選擇第乙個元素作為根節點 2 之後如果元素大於根節點...

二叉樹之 二叉樹深度

二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...

樹之二叉樹

二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。滿二叉樹 在二叉樹的第i 層上有2 i 1 個結點,深度為k的二叉樹有2 k 1個結點的二叉樹。則此二叉樹稱為 滿二叉...