基礎知識html
每個節點最多有兩棵子樹,因此二叉樹中不存在度大於2的節點,注意,是最多有兩棵,沒有也是能夠的
左子樹和右子樹是有順序的,次序不能顛倒,這點能夠在哈夫曼編碼中體現, 順序不一樣編碼方式不一樣編碼
-即便樹中某個節點中只有一個子樹的花,也要區分它是左子樹仍是右子樹指針
二叉樹通常有五種形態
1.空二叉樹
2.只有一個根節點
3.根結點只有左子樹
4.根節點只有右子樹code
1:在二叉樹的第i層上最多有2^i-1個節點
2:深度爲K的二叉樹之多有2^k-1個節點htm
這裏的深度K意思就是有K層的二叉樹
3:對於任何一棵二叉樹T,若是其終端節點有No個,度爲2的節點數有N2,則No=N2+1
4: 具備n個節點的徹底二叉樹的深度爲[log2n]+1([x]表示不大於x的最大整數)blog
//二叉樹的存儲結構,一個數據域,2個指針域 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;
//我在這裏實現的是,二叉樹的前序遍歷方式建立,若是要使用中序或者後序的方式創建二叉樹,只需將生成結點和構造左右子樹的順序改變便可 void CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); if(ch=='#') *T=NULL; else { *T=(BiTree )malloc(sizeof(BiTNode)); if(!*T) exit(-1); (*T)->data=ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } }
void PreOrderTraverse(BiTree T)//二叉樹的先序遍歷 { if(T==NULL) return ; printf("%c ",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } void InOrderTraverse(BiTree T)//二叉樹的中序遍歷 { if(T==NULL) return ; InOrderTraverse(T->lchild); printf("%c ",T->data); InOrderTraverse(T->rchild); } void PostOrderTraverse(BiTree T)//後序遍歷 { if(T==NULL) return; PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c ",T->data); }
#include<stdio.h> #include<stdlib.h> typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void PreOrderTraverse(BiTree T)//二叉樹的先序遍歷 { if(T==NULL) return ; printf("%c ",T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } void InOrderTraverse(BiTree T)//二叉樹的中序遍歷 { if(T==NULL) return ; InOrderTraverse(T->lchild); printf("%C ",T->data); InOrderTraverse(T->rchild); } void PostOrderTraverse(BiTree T)//後序遍歷 { if(T==NULL) return; PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c ",T->data); } void CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); if(ch=='#') *T=NULL; else { *T=(BiTree )malloc(sizeof(BiTNode)); if(!*T) exit(-1); (*T)->data=ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } void pri(){ printf("\n"); } int main() { BiTree T; printf("輸入樹(#表明空節點 AB#C##D##):"); CreateBiTree(&T); printf("前序遍歷的結果是:"); PreOrderTraverse (T); printf("\n中序遍歷的結果是:"); InOrderTraverse(T); printf("\n後序遍歷的結果是:"); PostOrderTraverse(T); pri(); return 0; }