日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构-二叉树的遍历

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构-二叉树的遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(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; }

?

好了,以上就是二叉樹的集中遍歷方式,如果有小伙伴有疑問的可以關注公眾號,我們在群里面一起探討交流哦!

總結

以上是生活随笔為你收集整理的数据结构-二叉树的遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。