1. 程式人生 > >C語言實現二叉樹的基本操作---建立、遍歷、求深度、求葉子結點

C語言實現二叉樹的基本操作---建立、遍歷、求深度、求葉子結點

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


typedefint ElemType;//資料型別

//定義二叉樹結構,與單鏈表相似,多了一個右孩子結點
typedef struct BiTNode{
ElemType data;//資料域
struct BiTNode*lChild, *rChlid;//左右子樹域
}BiTNode, *BiTree;


//先序建立二叉樹
int CreateBiTree(BiTree *T)
{
ElemType ch;
ElemType temp;


scanf("%d", &ch);
temp = getchar();


if (ch == -1)
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!(*T))
exit(-1);


(*T)->data = ch;
printf("輸入%d的左子節點:", ch);
CreateBiTree(&(*T)->lChild);
printf("輸入%d的右子節點:", ch);
CreateBiTree(&(*T)->rChlid);
}


return 1;
}


//先序遍歷二叉樹
void TraverseBiTree(BiTree T)
{
if (T == NULL)
return ;
printf("%d ", T->data);
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);


}


//中序遍歷二叉樹
void InOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
InOrderBiTree(T->lChild);
printf("%d ", T->data);
InOrderBiTree(T->rChlid);


}


//後序遍歷二叉樹
void PostOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
PostOrderBiTree(T->lChild);
PostOrderBiTree(T->rChlid);
printf("%d ", T->data);


}




//二叉樹的深度


int TreeDeep(BiTree T)
{
int deep = 0;
if(T)
{
int leftdeep = TreeDeep(T->lChild);
int rightdeep = TreeDeep(T->rChlid);
deep = leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}


//求二叉樹葉子結點個數


int Leafcount(BiTree T,int &num)
{  
if(T)
{
if(T->lChild ==NULL &&T->rChlid==NULL)
num++;
Leafcount(T->lChild,num);
Leafcount(T->rChlid,num);


}
return num;
}
//主函式
int main(void)
{
BiTree T;
BiTree *p = (BiTree*)malloc(sizeof(BiTree));
int deepth,num=0 ;
printf("請輸入第一個結點的值,-1表示沒有葉結點:\n");
CreateBiTree(&T);
printf("先序遍歷二叉樹:\n");
TraverseBiTree(T);
printf("\n");
printf("中序遍歷二叉樹:\n");
InOrderBiTree(T);
printf("\n");
printf("後序遍歷二叉樹:\n");
PostOrderBiTree(T);
printf("\n");
deepth=TreeDeep(T);
printf("樹的深度為:%d",deepth);
printf("\n");
Leafcount(T,num);
printf("樹的葉子結點個數為:%d",num);
printf("\n");
return 0;
}

相關推薦

C語言實現基本操作

       我在前面的部落格中講解了連結串列、棧和佇列,這些資料結構其實都是線性表,並且給出了詳細的實現。從今天開始,我們將要來學習樹,樹作為一種資料結構我們經常會用到,作為起步和基礎,我們先來實現二叉樹,也就是每個節點有不超過2個子節點的樹。對於樹的操作,最基本的建立、遍

C語言實現基本操作---建立深度葉子結點

#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedefint ElemType;//資料型別 //定義二叉樹結構,與單鏈表相似,多了一個右孩子結點 typed

c語言實現基本操作--連結串列儲存

利用二叉連結串列儲存,並且利用遞迴的方法實現二叉樹的遍歷(前序遍歷、中序遍歷和後續遍歷)操作。 c語言具體實現程式碼如下: #include<stdio.h> #include<stdlib.h> #include<malloc.h>

C語言實現各種基本運算的演算法

 包含如下函式: CreateBTree( BTNode * &b, char * str ) : 由 括號表 示 串 str 創 建二叉鏈b ; FindNode( BTNode * &b,  ElemType x ) : 返回data域 為 x的節

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

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

C語言實現的結構和常用操作

#include<stdio.h> #include <stdlib.h> typedef float ElemType; typedef struct S_BiTNode//定義結點型別結構體 { ElemType data;//資料域 str

C語言實現中統計葉子結點的個數&度為1&度為2的結點個數

演算法思想 統計二叉樹中葉子結點的個數和度為1、度為2的結點個數,因此可以參照二叉樹三種遍歷演算法(先序、中序、後序)中的任何一種去完成,只需將訪問操作具體變為判斷是否為葉子結點和度為1、度為2的結點及統計操作即可。 #include <stdio.h> #include &

C語言實現建立&

演算法思想(重點是遞迴的使用)  利用擴充套件先序遍歷序列建立二叉連結串列 採用類似先序遍歷的遞迴演算法,首先讀入當前根結點的資料,如果是'.'則將當前 樹根置為空,否則申請一個新結點,存入當前根結點的資料,分別用當前根結點的 左子域和右子域進行遞迴呼叫,建立左、右子樹. 

c語言實現的插入查詢刪除列印

目錄: 二叉樹的關鍵概念: 每個節點是一個自引用結構體,形式如下: struct TreeNode { struct TreeNode *leftPtr; /* pointer to left subtree */

C語言實現的各種及求解深度

#include<stdio.h> #include<malloc.h> #define MAXSIZE 100 typedef char dataType; //二叉樹結構 typedef struct bnode{ dataType data; struct bnode *lC

C語言實現的插入和刪除

二叉樹的插入刪除://首先介紹二叉樹的插入:     //首先需要明白插入的規則:每個建好的結點p都需要從跟結點開始與根結點相比較資料域,如果根結點的資料域小於結點p,則接著將結點p與根結點的右子樹相比較,否則p將與根結點的左子樹相比較;     //繼續往下類推,一直到最後

c語言實現建立程式(附帶註釋)

/******************************************************************/ //樹的遞迴思想,把每個節點當作是一棵樹,以後序遍歷為例 //步驟1:訪問左子樹.2訪問右子樹3.列印當前節點的值 //在節點遍歷時如果

c語言實現連結串列)非遞迴後序

演算法思想 因為後序遍歷是先訪問左子樹,再訪問右子樹,最後訪問根節點。當用棧實現遍歷時,必須分清返回根節點時,是從左子樹返回的還是從右子樹返回的。所以使用輔助指標r指向最近已訪問的結點。當然也可以在節點中增加一個標誌域,記錄是否已被訪問。 #include<iost

c語言實現常用演算法

構造二叉樹結點結構 typedef struct BT { char data; struct BT *l_chrild; struct BT *r_chrild; }BT; 建立二叉樹 BT* Create_tree()//

c語言實現的先序,中序,後序

// new.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <MEMORY.H> #include <STRING.H&

資料結構之---C語言實現的順序儲存

//二叉樹的順序儲存 //這裡利用迴圈佇列儲存資料 //楊鑫 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #defi

Java實現的創建和操作(有更新)

inf pre 讓我 保存 number 定義 ++ 錯誤 ole 博主強烈建議跳過分割線前面的部分,直接看下文更新的那些即可。 最近在學習二叉樹的相關知識,一開始真的是毫無頭緒。本來學的是C++二叉樹,但苦於編譯器老是出故障,於是就轉用Java來實現二叉樹的操作。但是

使用java實現的非遞迴

在前面的一片部落格中已經介紹了二叉樹遍歷的一些概念以及注意事項,如果有疑惑的可以回過頭看一看。 這裡我們主要討論的是使用非遞迴的演算法實現二叉樹的遍歷 前序遍歷: 思路: 1.使用一個棧來儲存元素,剛開始的時候將棧頂元素壓入棧 2.當棧不為空的時候做如下操作:彈

先中後序(遞迴非遞迴方法)層序 Java實現

第一部分:二叉樹結點的定義 二叉樹結點有三個屬性:資料域、左結點、右結點。構造方法寫三個引數,這樣建立結點的時候程式碼更簡潔,且要從葉子結點開始建立(從底往上建立)。注:如果只寫一個賦值引數的構造器,那麼建立節點的順序就無所謂了,但是建立二叉樹時要多寫幾行程式碼。 pack

利用棧結構實現的非遞迴深度葉子節點數兩個結點的最近公共祖先及結點的最大距離

原文地址:http://blog.csdn.net/forbes_zhong/article/details/51227747 利用棧實現二叉樹的非遞迴遍歷,並求二叉樹的深度、葉子節點數、兩個節點的最近公共祖先以及二叉樹結點的最大距離,部分參考《劍指offer》這本書