数据结构-二叉树的遍历
二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用于實現二叉查找樹和二叉堆。
二叉樹的每個結點至多只有二棵子樹(不存在度大于2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2^{i-1}個結點;深度為k的二叉樹至多有2^k-1個結點;對任何一棵二叉樹T,如果其終端結點數為n_0,度為2的結點數為n_2,則n_0=n_2+1。
一棵深度為k,且有2^k-1個節點的二叉樹,稱為滿二叉樹。這種樹的特點是每一層上的節點數都是最大節點數。而在一棵二叉樹中,除最后一層外,若其余層都是滿的,并且最后一層或者是滿的,或者是在右邊缺少連續若干節點,則此二叉樹為完全二叉樹。具有n個節點的完全二叉樹的深度為log2n+1。深度為k的完全二叉樹,至少有2^(k-1)個節點,至多有2^k-1個節點。
-摘自百科
二叉樹的其它的特性我就不多做介紹了,詳情請大家自行搜索!
此處著重介紹二叉樹的遍歷,二叉樹的遍歷存在四種方式:
先序遍歷:訪問根節點->遍歷左子樹->遍歷右子樹
中序遍歷:遍歷左子樹->訪問根節點->遍歷右子樹
后序遍歷:遍歷左子樹->遍歷右子樹->訪問根節點
如上圖所示的二叉樹
采用先序遍歷的結果為:ABDHIEJCFKG
采用中序遍歷的結果為:HDIBEJAFKCG
采用后序遍歷的結果為:HIDJEBKFGCA
下面首先通過C語言簡單實現二叉樹的初始化創建和先序遍歷的方式輸出每個節點所在樹的層次:
?
// // Created by Administrator on 2018/6/5. //#include "stdio.h" #include "stdlib.h"/*** 創建一棵二叉樹并輸出每個節點所在二叉樹的層次* 輸入方式:ABDH##I##E#J##CF#K##G##*/#define ElementType char typedef struct {ElementType data;struct BitTreeNode *lchild, *rchild; } BitTreeNode, *BitTree;/*** 創建一棵二叉樹:先序遍歷的方式* @param tree* @return 二叉樹*/ BitTree createBitTree(BitTree tree) {char c;scanf("%c", &c);if ('#' == c) {return 0;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createBitTree(tree->lchild);tree->rchild = createBitTree(tree->rchild);}return tree; }/*** 打印結果* @param data 節點元素* @param level 所在層數*/ void printLevel(char data, int level) {printf("%c 在第 %d 層\n", data, level); }/*** 先序遍歷* @param tree* @param level*/ void preOrder(BitTree tree, int level) {if (tree) {printLevel(tree->data, level);preOrder(tree->lchild, level + 1);preOrder(tree->rchild, level + 1);} }int main() {int level = 1;BitTree tree;tree = createBitTree(tree);printf("先序遍歷結果:\n");preOrder(tree, level);return 0; }?
接下來實現二叉樹的三種遍歷方式:
?
// // Created by Administrator on 2018/6/5. // /*** 二叉樹的三種遍歷方式:先序遍歷、中序遍歷、后序遍歷*/ #include "stdio.h" #include "stdlib.h"#define ElementType char typedef struct {ElementType data;struct BitTreeNode *lchild, *rchild; } BitTreeNode, *BitTree;/*** 創建一棵二叉樹:通過先序遍歷的方式創建* @param tree* @return 二叉樹*/ BitTree createBitTree(BitTree tree) {char c;scanf("%c", &c);if ('#' == c) {return 0;} else {tree = (BitTree) malloc(sizeof(BitTreeNode));tree->data = c;tree->lchild = createBitTree(tree->lchild);tree->rchild = createBitTree(tree->rchild);}return tree; }/*** 訪問節點* @param data 節點數據*/ void visit(char data) {printf("%c", data); }/*** 先序遍歷* @param tree*/ void preOrder(BitTree tree) {if (tree) {visit(tree->data);preOrder(tree->lchild);preOrder(tree->rchild);} }/*** 中序遍歷* @param tree*/ void inOrder(BitTree tree) {if (tree) {inOrder(tree->lchild);visit(tree->data);inOrder(tree->rchild);} }/*** 后序遍歷* @param tree*/ void postOrder(BitTree tree) {if (tree) {postOrder(tree->lchild);postOrder(tree->rchild);visit(tree->data);} }int main() {BitTree tree;tree = createBitTree(tree);printf("先序遍歷結果:");preOrder(tree);printf("\n");printf("中序遍歷結果:");inOrder(tree);printf("\n");printf("后序遍歷結果:");postOrder(tree);printf("\n");return 0; }?
好了,以上就是二叉樹的集中遍歷方式,如果有小伙伴有疑問的可以關注公眾號,我們在群里面一起探討交流哦!
總結
以上是生活随笔為你收集整理的数据结构-二叉树的遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Execl矩阵如何转化成Pajek的ne
- 下一篇: 数据结构-二叉树的非递归遍历