樹結構是一種描述非線性關係的資料結構。對於樹的基本概念不想過多贅述,可以自行查閱相關資料,這裡主要講解一種簡單的樹結構——二叉樹。二叉樹是樹的一種特殊形式,它有n個結點,每個結點最多有兩個子結點。二叉樹的子樹仍然是二叉樹,二叉樹的兩個子樹分別是左子樹和右子樹,因此二叉樹也是有序樹。二叉樹又分為:完全二叉樹和滿二叉樹,概念不再詳述,自行查詢。
完全二叉樹的性質:
1、如果m!=1,則結點m的父節點為m/2;
2、如果2*m<=n,則m的左子樹編號為2*m;若2*m>n則無左子樹,也無右子樹。
3、如果2*m+1<=n,則m的右子樹編號為2*m+1;若2*m+1>n則無右子樹。
完全二叉樹的深度為[log2n]+1。
二叉樹的儲存方式:1、順序儲存 2、鏈式儲存。
順序儲存即按層將二叉樹儲存到乙個陣列中,這裡不再詳述,重點講鏈式儲存。
二叉樹的鏈式儲存:
1、資料部分
class cbttype //定義二叉樹結點型別
2、初始化二叉樹
cbttype inittree() //初始化二叉樹的根
else
}return
null;
}
3、新增結點
void addtreenode(cbttype treenode) //新增結點
system.out.printf("1.新增該結點到左子樹\n2.新增該結點到右子樹\n");
doelse
else
break;
case
2: //新增到右結點
if( parent.right!=null) //右子樹不為空
else
break;
default:
system.out.printf("無效引數!\n");}}
}}while(menusel!=1 && menusel!=2);
}}
4、查詢結點
cbttype treefindnode(cbttype treenode,string
data) //查詢結點
else
else
//查詢左右子樹
else
if((ptr=treefindnode(treenode.left,data))!=
null)
else}}
}
5、獲取左/右子樹
cbttype treeleftnode(cbttype treenode) //獲取左子樹
else
}cbttype treerightnode(cbttype treenode) //獲取右子樹
else
}
6、判斷樹是否為空 計算二叉樹深度
int treeisempty(cbttype treenode) //判斷空樹
else
}int treedepth(cbttype treenode) //計算二叉樹深度
else
else
} }
7、清空二叉樹 顯示結點資料
void cleartree(cbttype treenode) // 清空二叉樹
}void treenodedata(cbttype p) //顯示結點資料
8、二叉樹遍歷演算法
(1)按層遍歷演算法
void leveltree(cbttype treenode) //按層遍歷
while(head!=tail) //佇列不為空,進行迴圈
if(p.right!=null) //如果結點存在右子樹
}}
(2)先序遍歷
void dlrtree(cbttype treenode)
//先序遍歷
}
(3)中序遍歷
void ldrtree(cbttype treenode)
//中序遍歷
}
(4)後序遍歷
void lrdtree(cbttype treenode)
//後序遍歷
}
到此為止,樹的基本資料結構就到此結束了! 資料結構 (四)棧
總體來說,棧的知識比線性表 順序表簡單很多。但是同時也有許多需要注意的點,稍稍不注意就可能會出現錯誤,因此,雖然簡單一點,但也要細心學習。一 基本知識 棧 限定僅在表尾進行插入和刪除操作的線性表。允許插入和刪除的一端稱為棧頂,另一端稱為棧底。空棧 不含任何資料元素的棧。棧的操作特性 後進先出 注意 ...
資料結構 四 棧
棧是限定僅在表尾進行插入和刪除的線性表 typedef struct sqstack 棧的順序基本操作 1 進棧操作 status push sqstack s,selemtype e s top s data s rop e return ok 2 出棧操作 status pop sqstack ...
資料結構之棧(四)
本文將繼續擴充套件stack在arithmetical expression的處理方面的應用,其中包括 postfix2prefix postfix2infix 和 infix2postfix 一 postfix2prefix 它是通過多次入棧和出棧來完成的。主要步驟是 遍歷 postfix str...