1. 程式人生 > >二叉樹的基本操作精集(建立、遍歷、求深度結點以及葉子結點個數)

二叉樹的基本操作精集(建立、遍歷、求深度結點以及葉子結點個數)

對於二叉樹的操作一般的我們使用遞迴的方法,因為在二叉樹中每一個子樹又是一顆二叉樹
這篇程式碼主要是演示了二叉樹的以下操作

  • 二叉樹的建立
  • 二叉樹的三種遍歷
  • 求解二叉樹的高度
  • 求解指定層數的結點個數
  • 求解二叉樹的葉子結點個數
/*********************************************************
-  Copyright (C): 2016
-  File name    : tree.c
-  Author       : - Zhaoxinan -
-  Date         : 2016年07月31日 星期日 19時44分36秒
-  Description  : 
*  *******************************************************/
#include <stdio.h> #include <stdlib.h> //定義結點 typedef struct BiTNode { char data; //資料 struct BiTNode *lchild; //左孩子 struct BiTNode *rchild; //右孩子 }BiTNode, *BiTree; ////////////////////////////////////////////////////////// //先序建立二叉樹 BiTree CreateBiTree() { char ch; BiTree T; scanf("%c", &ch); if (ch == '#'
) { T = NULL; } else { T = (BiTree)malloc(sizeof(BiTNode)); T->data = ch; T->lchild = CreateBiTree(); T->rchild = CreateBiTree(); } return T; } ////////////////////////////////////////////////////////// //先序遍歷而叉樹 void PreOrderTraverse(BiTree T) { if (T) { printf("%c", T->data); PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } ///
///////////////////////////////////////////////////////
//中序遍歷二叉樹 void InOrderTraverse(BiTree T) { if (T) { InOrderTraverse(T->lchild); printf("%c",T->data); InOrderTraverse(T->rchild); } } ////////////////////////////////////////////////////////// //後序遍歷二叉樹 void PostOrderTraverse(BiTree T) { if (T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); printf("%c", T->data); } } /*//////////////////////////////////////////////////////// 求二叉樹中的節點個數 遞迴解法: 1、如果二叉樹為空,節點個數為0 2、如果二叉樹不為空,二叉樹節點個數 = 左子樹節點個數+右子樹節點個數+1 *///////////////////////////////////////////////////////// int GetNodeNum(BiTree T) { if (T == NULL) { return 0; } return GetNodeNum(T->lchild)+GetNodeNum(T->rchild)+1; } /*/////////////////////////////////////////////////////// 求二叉樹的深度 遞迴解法: 1、如果二叉樹為空,二叉樹的深度為0 2、如果二叉樹不為空,二叉樹的深度= max(左子樹深度+右子樹深度)+1 *////////////////////////////////////////////////////// int GetTreeDepth(BiTree T) { if (T == NULL) { return 0; } int LDepth = GetTreeDepth(T->lchild); int RDepth = GetTreeDepth(T->rchild); return LDepth > RDepth ? (LDepth + 1) : (RDepth + 1); } /*/////////////////////////////////////////////////////// 求二叉樹第K層的節點個數 1、如果二叉樹為空或著k<1 返回0 2、如果二叉樹不為空並且K == 1,返回1 3、如果二叉樹不為空並且K>1,返回左子樹中K-1層的節點個數與右子樹k-1層節點個數之和 *////////////////////////////////////////////////////// int GetNodeNumKthLevel(BiTree T, int k) { if (T == NULL || k < 1) { return 0; } if (k == 1) { return 1; } int numleft = GetNodeNumKthLevel(T->lchild, k-1); int numright = GetNodeNumKthLevel(T->rchild, k-1); return (numleft + numright); } /*/////////////////////////////////////////////////////// 求二叉樹中葉子節點的個數 1、如果二叉樹為空,返回0 2、如果二叉樹不為空且左右子樹為空,返回1 3、如果二叉樹不為空,且左右子樹不同時為空,返回左子樹中葉子節點個數 */////////////////////////////////////////////////////// int GetLeafNodeNum(BiTree T) { if (T == NULL) { return 0; } if (T->lchild == NULL && T->rchild == NULL) { return 1; } int numleft = GetLeafNodeNum(T->lchild); int numright = GetLeafNodeNum(T->rchild); return (numleft + numright); } ////////////////////////////////////////////////////////// int main() { int TreeLevel; //二叉樹的層數 int TreeLeafNum = 0; //二叉樹的葉子節點個數 int TreeKlevelNum = 0; //二叉樹第K層的節點個數 int TreeDepth = 0; //二叉樹的深度 int TreeNodeNum = 0; //二叉樹結點個數 BiTree T; T = CreateBiTree(); //建立二叉樹 printf("\n----------前序遍歷---------\n"); PreOrderTraverse(T); printf("\n----------中序遍歷---------\n"); InOrderTraverse(T); printf("\n----------後序遍歷---------\n"); PostOrderTraverse(T); printf("\n----------節點個數---------\n"); TreeNodeNum = GetNodeNum(T); printf("%d\n", TreeNodeNum); printf("\n----------樹的深度---------\n"); TreeDepth = GetTreeDepth(T); printf("%d\n", TreeDepth); printf("\n---------樹的葉子節點-------\n"); TreeLeafNum = GetLeafNodeNum(T); printf("%d\n", TreeLeafNum); printf("\n請輸入樹的層數,將會得到該層節點數\n"); scanf("%d", &TreeLevel); TreeKlevelNum = GetNodeNumKthLevel(T, TreeLevel); printf("\n---------%d層節點數--------\n", TreeLevel); printf("%d\n", TreeKlevelNum); return 0; }

對應以上程式碼,我們將#代替空結點
例如:我們輸入AB##CD##EF###代表如下樹
這裡寫圖片描述

程式碼測試結果如下

這裡寫圖片描述

相關推薦

基礎操作 ,前中後序高度,搜尋排序Java實現 程式碼集合

首先,定義一個樹類Tree.java public class Tree { public TreeNode root; } 定義樹節點類TreeNode.java public class TreeNode { public TreeNode(int

基本操作建立深度結點以及葉子結點個數

對於二叉樹的操作一般的我們使用遞迴的方法,因為在二叉樹中每一個子樹又是一顆二叉樹。 這篇程式碼主要是演示了二叉樹的以下操作 二叉樹的建立 二叉樹的三種遍歷 求解二叉樹的高度 求解指定層數的結點個數 求解二叉樹的葉子結點個數 /***********

建立深度

#include <stdio.h> #include <stdlib.h> typedef struct node { char data; struct node *lchild,*rchild; }BSTree; void Initiate(BSTr

劍指Offer------把列印成多行層序

題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 <分析>: 本題就是多了個條件 一層輸出一行 那麼就多設定兩個變數即可, 一個此行開始start,另一個此行

基本操作實現及總結適合複習

本文包含以下內容 1 ,二叉樹三種建立 前序遞迴 表示式非遞迴 孩子兄弟表示式非遞迴 2,遍歷 三種遍歷的遞迴與非遞迴實現(前中後序) 層次遍歷(普通二叉樹,孩子兄弟連結串列)

基本操作

arch 非遞歸 alt pro stack depth 隊列 步驟 read 廣度優先搜索 1、把根節點入隊列; 2、如果隊列非空,出隊,再依次將左子樹入隊、右子樹入隊; 3、重復步驟2,直到隊列為空。 void BreadFirstSearch(TreeNode *ro

線索基本操作的實現

2018-11-18-18:25:23 一:二叉樹 1.二叉樹的性質   ①:在二叉樹的第i層上至多有pow(2,i-1)個結點(i>=1)。   ②:深度為k的二叉樹至多有pow(2,k)-1個結點(k>=1)。   ③:對任何一顆二叉樹T,如果其終端結點的個數為n0,度為2的結點數為

【資料結構】基本操作

文章目錄 BinaryTree.h BinaryTree.c Test.c 棧和佇列的相關函式: 棧:https://blog.csdn.net/weixin_41892460/article/details/82

C語言-基本操作以及搜尋基本操作

功能 二叉樹操作: 建立二叉樹 遍歷二叉樹(前序,中序,後續) 計算高度 計算結點數目 清空二叉樹 空樹判斷 二叉搜尋樹操作: 插入 最值(最大值,最小值) 刪除 程式碼 #include &l

c++學習筆記—基本操作的實現

用c++語言實現的二叉樹基本操作,包括二叉樹的建立、二叉樹的遍歷(包括前序、中序、後序遞迴和非遞迴演算法)、求二叉樹高度,計數葉子節點數、計數度為1的節點數等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include

超全C語言基本操作及講解

今天刷LeetCode上的題的時候,做到了關於二叉樹的題,於是決定把這一塊的知識整理一下。1、二叉樹的定義二叉樹通常以結構體的形式定義,如下,結構體內容包括三部分:本節點所儲存的值、左孩子節點的指標、右孩子節點的指標。這裡需要注意,子節點必須使用指標,就像我們定義結構體連結串

實驗四 基本操作的實現

實現鏈式儲存建立,遞迴先序 中序 後序遍歷,葉子結點數,數的結點總數,交換左右子樹 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int cnt; //結點宣告,資

常用操作演算法解釋及注意事項

二叉樹是一種常用的資料結構,在程式中也經常需要使用二叉樹,但是你所使用語言卻並不一定提供了二叉樹這種資料型別,所以為了方便使用,我們可以自己實現一個二叉樹的資料型別。在需要時就像使用其他已定義的型別一樣方便。 下面給出一些本人寫的演算法和解釋(基於C語言),希望對讀者寫一

【演算法】的遞迴和非遞迴

原文地址 【寫在前面】   二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採

資料結構——的遞迴與非遞迴先序,中序,後序

實驗專案五 二叉樹基本操作的實現 課程名稱:資料結構 實驗專案名稱:二叉樹基本操作的實現 實驗目的: 1.掌握樹的基本操作—遍歷。 實驗要求: 1、 分別用遞迴和非遞迴的方法實現一棵樹的三種遍歷。 實驗過程: 建立一棵二叉樹(二叉樹如下圖所示);

平衡的C語言實現建立插入查詢刪除旋轉【資料結構】

平衡二叉樹(AVL)或者是一顆空樹,或者是具有下列性質的非空二叉搜尋樹: (1). 任一結點的左、右子樹均為AVL樹; (2). 任一結點的左、右子樹高度差的絕對值不超過1。 對於二叉樹中任一結點T,其“平衡因子”(Balance Factor, BF)定義為BF(T)

的前中後和層序詳細圖解遞迴和非遞迴寫法

我家門前有兩棵樹,一棵是二叉樹,另一棵也是二叉樹。 遍歷一棵二叉樹常用的有四種方法,前序(PreOrder)、中序(InOrder)、後序(PastOrder)還有層序(LevelOrder)。 前中後序三種遍歷方式都是以根節點相對於它

的遞迴與非遞迴前序中序後序

【寫在前面】   二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的

的 前序 || 中序 || 後序

中序遍歷 == ren c++ 代碼 right 結點 esp style 直奔代碼: 1 ///前序遍歷:先遍歷根節點,再遍歷左子樹,最後遍歷右子樹 2 /* 3 #include <bits/stdc++.h> 4 using namesp

的前序中序後序-非遞歸-使用同一段代碼實現

非遞歸 傳統 前序遍歷 turn stack 實現 pan ++ tro 樹的遍歷通常使用遞歸,因為它的實現更簡單,代碼也更容易理解。 但在面試,或者特殊的情境中會使用到叠代算法(非遞歸)。 此時需要使用棧去模擬函數棧調用過程。 本文將給出一段代碼去實現這三種遍歷 相比