度就是乙個節點的分支數
對於任何乙個 二叉樹,如 果其葉節點的個數為n0,度為2的非葉節點個數是n2,則有n0=n2+1
(n0+n1+n2=2*n2+n1+1)——-(n0=n2+1);
度為1的非葉子節點個數為n1;
節點個數為n0+n1+n2;
邊的個數為2*n2+n1;
節點的個數為:邊的個數+1;
具有n個節點的完全二叉樹的深度k為log2(n+1)向上取整。
乙個具有n個節點的完全二叉樹,如果按照從上至下從左到右的順序對所有節點從0開始編號,則對於序號為i的節點有:
1)若》0,雙親訊號為:(i-1)/2;
i=0;i為根節點編號,沒有雙親
2)若2i+1二叉樹形如下圖:
樹的結構體 :
typedef
struct binarytreenode//樹的結構體
btnode;
思想:建立一棵樹,首先應該建立乙個 新的樹的根節點,遍歷乙個 陣列,陣列 的內容就是樹的資料,當陣列中為「#」時,代表是空樹,使用遞迴的方法依次建立左子樹和右子書。
**如下:
btnode* creattree(datatype a,int size,int* index)
if (a[*index] == '#')//代表子樹為空的情況
//btnode* proot = (btnode*)malloc(sizeof(btnode));
proot->data = a[*index];
(*index)++;
proot->lefttree = creattree(a, size, index);
proot->righttree = creattree(a, size, index);
return proot;
}
遞迴方式void prevorder(btnode* proot)//前序遍歷
printf("%c-", proot->
data);//輸出根節點
prevorder(proot->lefttree);//遞迴左子樹
prevorder(proot->righttree);//遞迴右子樹
}
非遞迴方式 :void unprevorder(btnode* proot)//前序遍歷非遞迴
//左子樹為空時開始尋找右子樹
ptop = top(&s);
stackpop(&s);
pcur = ptop->righttree;}}
遞迴:void inorder(btnode* proot)//中序遍歷
inorder(proot->lefttree);
printf("%c-", proot->
data);
inorder(proot->righttree);
}
非遞迴:void uninorder(btnode* proot)//中序遍歷非遞迴
ptop = top(&s);
stackpop(&s);
printf("%c ", ptop->
data);
pcur = ptop->righttree;}}
遞迴void postorder(btnode* proot)//後序遍歷
postorder(proot->lefttree);
postorder(proot->righttree);
printf("%c-", proot->
data);
}
非遞迴:void unpostorder(btnode* proot)//後序遍歷非遞迴
ptop = top(&s);
if (ptop->righttree ==
null
|| ptop->righttree==last)
pcur = ptop->righttree;}}
void unlevelorder(btnode* proot)//層序遍歷非遞迴
queneinit(&q);
quenepush(&q, proot);
while (!queneempty(&q))
if (frontnode->righttree !=
null)
}printf("\n");
}
int countofnodeone(btnode* proot)//求節點數量
n++;
countofnodeone(proot->lefttree);
countofnodeone(proot->righttree);
return n;
}
劃分成子問題也可以解決int countofnodetwo(btnode* proot)//求節點數量,分解為子問題
return countofnodetwo(proot->lefttree) + countofnodetwo(proot->righttree) +
1;}
int countofleafnode(btnode* proot)//求葉子節點的個數
if ((proot->lefttree)==
null
&&(proot->righttree==
null))
return countofleafnode(proot->lefttree) + countofleafnode(proot->righttree);
}
int countknode(btnode* proot,int k)//求第k層節點的數量
if (proot != null&&k == 1)
return countknode(proot->lefttree, k - 1) + countknode(proot->righttree, k - 1);
}
int depthofnode(btnode* proot)//求一棵樹的高度
int left = depthofnode(proot->lefttree);
int right = depthofnode(proot->righttree);
return max(left, right)+1;
}
btnode* findtreenode(btnode* proot, datatype x)
if (proot->
data
== x)
btnode* foundnode;
foundnode=findtreenode(proot->lefttree, x);
if (foundnode !=
null)
return findtreenode(proot->righttree, x);
}
test()
; int i = 0;
int ret = 0;
int len = sizeof(arr) / sizeof(arr[0]);
btnode* node;
btnode* proot = (btnode*)malloc(sizeof(btnode));
proot = creattree(arr, len, &i);
prevorder(proot);
printf("\n");
unprevorder(proot);
printf("\n");
inorder(proot);
printf("\n");
uninorder(proot);
printf("\n");
postorder(proot);
printf("\n");
unpostorder(proot);
printf("\n");
ret = countofnodetwo(proot);
printf("層序遍歷:\n");
unlevelorder(proot);
printf("節點總個數為:%d\n", ret);
printf("葉子節點的個數為:%d\n", countofleafnode(proot));
printf("第%d層節點的個數為:%d\n",3,countknode(proot, 3));
printf("該樹的深度為:%d\n", depthofnode(proot));
node = findtreenode(proot, 'f');
if (node == null)
else
}
二叉樹的概念及建立
一棵二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成。1.若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有2 i 1 i 0 個結點 2.若規定只有根節點的二叉樹的深度為1,則深度為k的二叉樹的最大結點數是2 k 1 k 0 3.對任何...
二叉樹的相關概念
一 概念 二叉樹 二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩顆分別稱為左子樹和右子樹的二叉樹組成。二叉樹的特點 1.每個結點最多有兩顆子樹,即二叉樹不存在度大於2的結點。2.二叉樹的子樹有左右之分,其子樹的次序不能顛倒。滿二叉樹 在一棵二叉樹中,如果所有分支節點都存在左子樹...
樹與二叉樹相關概念
樹是n n 0 個節點的有限集合。在任意一顆非空樹中 1 有且僅有乙個特定的稱為根的節點 2 當 n 1 時,其餘節點可分為m m 0 個互不相交的有限集 t1 t2 tm,其中每乙個集合本身又是一棵樹,並且稱為根的子樹。根 根節點 沒有前驅 葉子 又叫終端節點 沒有後繼,度為0 森林 m m 0 ...