樹的定義與操作

2021-08-21 07:05:39 字數 4072 閱讀 9008

有乙個特殊的結點,稱為根結點,根節點沒有前驅結點

除根節點外,其餘結點被分成m(m>0)個互不相交的集合t1、t2、……、tm,其中每乙個集合ti(1<= i <= m)又是一棵結構與樹類似 的子樹。每棵子樹的根結點有且只有乙個前驅,可以有0個或多個後繼。

樹是遞迴定義的。

二叉樹

一棵二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩棵分別稱為左子樹和右子樹的二叉樹組成。

特點:每個結點最多有兩棵子樹,即二叉樹不存在度大於2的結點

二叉樹的子樹有左右之分,其子樹的次序不能顛倒

滿二叉樹:

在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹, 並且所有葉子節點都在同一層上

完全二叉樹:

如果一棵具有n個結點的二叉樹的結構與滿二叉樹的前n個 結點的結構相同,稱為完全二叉樹

鏈式儲存二叉樹的操作

#pragma once

#includetypedef char datatype;

typedef struct bintreenodebintreenode;

#include "bintree.h"

#include "queue.h"

#include "stack.h"

bintreenode * createroot(datatype data)

bintreenode * createtree(datatype preorder, int size, int *pindex)

if (preorder[*pindex] == '#')

bintreenode *proot = createroot(preorder[*pindex]);

*pindex += 1;

proot->pleft = createtree(preorder, size, pindex);

proot->pright = createtree(preorder, size, pindex);

return proot;

}bintreenode * createtree2(datatype **str)

if (**str == '#')

bintreenode *proot = createroot(**str);

(*str)++;

proot->pleft = createtree2(str);

proot->pright = createtree2(str);

return proot;

}//前序遍歷

void preorder(bintreenode *proot)

printf("%c ", proot->data);

preorder(proot->pleft);

preorder(proot->pright);

}//非遞迴前序遍歷

void preorderr(bintreenode *proot)

ptop = stacktop(&stack);

stackpop(&stack);

pcur = ptop->pright;

} printf("\n");

}//中序遍歷

void inorder(bintreenode *proot)

inorder(proot->pleft);

printf("%c ", proot->data);

inorder(proot->pright);

}//非遞迴中序遍歷

void inorderr(bintreenode *proot)

ptop = stacktop(&stack);

printf("%c ", ptop->data);

stackpop(&stack);

pcur = ptop->pright;

} printf("\n");

}//後序遍歷

void backorder(bintreenode *proot)

backorder(proot->pleft);

backorder(proot->pright);

printf("%c ", proot->data);

}//非遞迴後序遍歷

void backorderr(bintreenode *proot)

ptop = stacktop(&stack);

if (!ptop->pright || ptop->pright == plast)

pcur = ptop->pright;

} printf("\n");

}//二叉樹的高度

int gethight(bintreenode *proot)

int left = gethight(proot->pleft);

int right = gethight(proot->pright);

return left > right ? left + 1 : right + 1;

}//總結點個數

int getsize(bintreenode *proot)

return getsize(proot->pleft) + getsize(proot->pright) + 1;

}//葉子結點個數

int getleafsize(bintreenode *proot)

if (!proot->pleft && !proot->pright)

return getleafsize(proot->pleft) + getleafsize(proot->pright);

}//第k層結點個數

int getlevelsize(bintreenode *proot, int k)

if (k == 1)

return getlevelsize(proot->pleft, k - 1) + getlevelsize(proot->pright, k - 1);

}//查詢結點

bintreenode * findnode(bintreenode *proot, int n)

if (proot->data == n)

bintreenode * newnode = findnode(proot->pleft, n);

if (newnode)

return findnode(proot->pright, n);

}//層序遍歷

void levelorder(bintreenode *proot)

queue queue;

bintreenode *pfront;

queueinit(&queue);

queuepush(&queue, proot);

while (!queueisempty(&queue))

if (pfront->pright)

} printf("\n");

}//判斷是否為完全二叉樹

int isprefectbintree(bintreenode *proot)

queue queue;

bintreenode *pfront;

queueinit(&queue);

queuepush(&queue, proot);

while (1)

queuepush(&queue, pfront->pleft);

queuepush(&queue, pfront->pright);

} while (!queueisempty(&queue))

queuepop(&queue);

} return 1;

}int main()

測試結果:

二叉樹中使用佇列的方法可見:

佇列操作

二叉樹中使用棧的方法可見:棧操作

樹的定義與性質

在資料結構中,把樹枝分叉處 樹葉 樹根抽象為結點,其中樹根抽象為根節點,且對一棵樹來說最多存在乙個根節點 把樹葉概括為葉子節點,且葉子結點不再延伸出心得結點,把莖稈和樹枝統一抽象為邊,且一條邊只能用來連線兩個結點 乙個端點乙個 這樣,樹就被定義為由若干結點和若干條邊組成的資料結構,且在樹中的結點不能...

樹的定義及基本操作

首先,什麼是樹呢?數的定義是遞迴的 定義樹是滿足以下條件的,包含至少乙個結點的有限集合 1 樹中有乙個特別指定的結點,稱為根,或樹根。2 其它結點劃分成n 0個不相交的集合t1 tn 每個集合又還是一棵樹,但稱為根的子樹。樹的主要操作包括 求樹的深度 求給定節點的子節點 兄弟節點 遍歷樹 插入子樹 ...

樹的定義及基本操作

首先,什麼是樹呢?數的定義是遞迴的 定義樹是滿足以下條件的,包含至少乙個結點的有限集合 1 樹中有乙個特別指定的結點,稱為根,或樹根。2 其它結點劃分成n 0個不相交的集合t1 tn 每個集合又還是一棵樹,但稱為根的子樹。樹的主要操作包括 求樹的深度 求給定節點的子節點 兄弟節點 遍歷樹 插入子樹 ...