1. 程式人生 > >順序儲存完全二叉樹的基本操作

順序儲存完全二叉樹的基本操作

#include<stdio.h>
#include<malloc.h>
#define MAX_TREE_NODE_SIZE 100
typedef struct
{
int item[MAX_TREE_NODE_SIZE]; //根儲存在下標為1的陣列單元中,內容為結點的表示數字
int n; //當前完全二叉樹的結點個數
}QBTree;
QBTree *BT;

void CreateBTree(QBTree *BT,int data[],int n) //構造一棵完全二叉樹
{
if (n >= MAX_TREE_NODE_SIZE)
n = MAX_TREE_NODE_SIZE-1; //因為下標從1開始
for (int i = 1; i <= n;i++)
BT->item[i] = data[i];
BT->n=n;
}

int LeftChild_locate(QBTree BT,int node) //獲取給定結點(位置)的左孩子的結點位置
{
if (node > BT.n)
{
printf("該結點不存在!/n");
return 0;
}
else if ((2 * node) > BT.n)
return -1;
else
return 2 * node;
}

int LeftChild_value(QBTree BT,int node) //獲取給定結點(值)的左孩子的結點位置
{
int tmp = 0;
for (int i = 1;i <= BT.n;i++)
{
if (BT.item[i] == node)
{
tmp = i;
break;
}
}
if ((tmp != 0) && ((2 * tmp) <= BT.n))
{
return 2 * tmp;
}
else
return -1;
}

int RightChild_locate(QBTree BT,int node) //獲取給定結點(位置)的右孩子的結點位置
{
if ((2 * node + 1) > BT.n)
return -1;
else
return 2 * node + 1;
}

int RightChild_value(QBTree BT,int node) //獲取給定結點(值)的右孩子的結點位置
{
int tmp = 0;
for (int i = 1;i <= BT.n;i++)
{
if (BT.item[i] == node)
{
tmp = i;
break;
}
}
if ((tmp != 0) && ((2 * tmp + 1) <= BT.n))
{
return 2 * tmp + 1;
}
else
return -1;
}

int Parent(QBTree BT,int node) //獲取給定結點(位置)的父親
{
if ((1 < node) && (node <= BT.n)) //1結點沒有父結點
return node/2;
else
return -1;
}

bool IsEmpty(QBTree BT) //判斷二叉樹是否為空
{
if (BT.n == 0)
return true;
else
return false;
}

void ClearBTree(QBTree *BT) //清空以BT為根的二叉樹
{
BT->n = 0;
}

void layer_Traverse(QBTree BT) //遍歷,由於是順序儲存,直接順序遍歷就是按層次遍歷
{
for (int i = 1;i <= BT.n;i++)
{
printf("%d ",BT.item[i]);
if (i % 5 == 0)
printf("/n");
}
}

void forward_Traverse(QBTree BT,int i) //前序遞迴遍歷,先把左的遍歷完再回溯
{
if (!IsEmpty(BT))
{
printf("%d ",BT.item[i]); //對輸入的結點操作
if ((LeftChild_locate(BT,i)) != -1) //如果左子結點存在,遞迴
forward_Traverse(BT,LeftChild_locate(BT,i));
if ((RightChild_locate(BT,i)) != -1) //如果右子結點存在,遞迴
forward_Traverse(BT,RightChild_locate(BT,i));
}
else
{
printf("該樹為空!/n");
}
}

void middle_Traverse(QBTree BT,int i) // 中序遞迴遍歷
{
if (!IsEmpty(BT))
{
if ((LeftChild_locate(BT,i)) != -1) //如果左子結點存在,遞迴
middle_Traverse(BT,LeftChild_locate(BT,i));
printf("%d ",BT.item[i]); //對輸入的結點操作
if ((RightChild_locate(BT,i)) != -1) //如果右子結點存在,遞迴
middle_Traverse(BT,RightChild_locate(BT,i));
}
else
{
printf("該樹為空!/n");
}
}

void back_Traverse(QBTree BT,int i) //後序遞迴遍歷
{
if (!IsEmpty(BT))
{
if ((LeftChild_locate(BT,i)) != -1) //如果左子結點存在,遞迴
back_Traverse(BT,LeftChild_locate(BT,i));
if ((RightChild_locate(BT,i)) != -1) //如果右子結點存在,遞迴
back_Traverse(BT,RightChild_locate(BT,i));
printf("%d ",BT.item[i]); //對輸入的結點操作
}
else
{
printf("該樹為空!/n");
}
}

void main()
{
int data[6];
BT = (QBTree*)malloc(sizeof(QBTree));
for (int i = 1;i <= 5;i++)
{
scanf("%d",&data[i]);
}
CreateBTree(BT,data,5); //1 2 3 4 5
int lc = LeftChild_locate(*BT,2);
printf("%d/n",lc);
int rc = RightChild_locate(*BT,1);
printf("%d/n",rc);
layer_Traverse(*BT); //1 2 3 4 5
printf("/n");
forward_Traverse(*BT,1); //1 2 4 5 3
printf("/n");
back_Traverse(*BT,1); //4 5 2 3 1
printf("/n");
middle_Traverse(*BT,1); //4 2 5 1 3
}

相關推薦

順序儲存完全基本操作

#include<stdio.h>#include<malloc.h>#define MAX_TREE_NODE_SIZE 100typedef struct {int item[MAX_TREE_NODE_SIZE]; //根儲存在下標為1的陣列單元

基本操作

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

順序儲存的最近的公共祖先問題 (25 分)

順序儲存的二叉樹的最近的公共祖先問題 (25 分) 層次生成二叉樹 設順序儲存的二叉樹中有編號為i和j的兩個結點,請設計演算法求出它們最近的公共祖先結點的編號和值。 輸入格式: 輸入第1行給出正整數n(≤1000),即順序儲存的最大容量;第2行給出n個非負整數,其間以空格分隔。其

線索基本操作的實現

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

浙大版《資料結構》習題4.5 順序儲存的最近的公共祖先問題 (25 分)

設順序儲存的二叉樹中有編號為i和j的兩個結點,請設計演算法求出它們最近的公共祖先結點的編號和值。 輸入格式: 輸入第1行給出正整數n(≤1000),即順序儲存的最大容量;第2行給出n個非負整數,其間以空格分隔。其中0代表二叉樹中的空結點(如果第1個結點為0,則

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

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

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

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

實驗四 基本操作的實現

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

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

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

連結儲存轉為順序儲存

1、題目:  Problem Description 問題描述:設有一棵二叉樹,其節點值為字元型並假設各值互不相等,採用二叉連結串列儲存表示。現輸入其擴充套件二叉樹的前序遍歷序列,建立該二叉連

java由先根中根遍歷序列建立,由標明空子建立,有完全順序儲存結構建立鏈式儲存結構

    //由先根和中根遍歷建立二叉樹 public class bitree{     public bitree(String preorder,String inorder,int preindex,int in

[C++11] 順序儲存完全構造樹形結構

     我們知道,二叉樹有兩種基本的儲存方式:順序儲存方式和樹形儲存方式。在用程式碼實現之前,我們先來分析一下我們的思路:      (1)分析                假定我們採用如下結構來順序儲存一棵二叉樹。               不難看出seq是一個動態

n個結點的完全順序存儲在一維數組中

完全二叉樹 pmo 一維數組 LG 結點 weibo 順序存儲 get VR 347jvo6rji換言指縣奧嫡勤願劣笨《http://weibo.com/p/230927987959983096209408》 ixtlati6zo敵諶瓷芬嗡梅哺遣杏新《http://wei

基本概念(滿完全,滿的遍歷)

1. 二叉樹 二叉樹是每個節點最多有兩個子樹的樹結構。它有五種基本形態:二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空。 性質1:二叉樹第i層上的結點數目最多為 2{i-1} (i≥1)。性質2:深度為k的二叉樹至多有2{k}-1個結點(k≥1)

【資料結構週週練】014 利用棧和非遞迴演算法求鏈式儲存是否為完全

一、前言 首先,明天是個很重要的節日,以後我也會過這個節日,在這裡,提前祝所有程式猿們,猿猴節快樂,哦不,是1024程式設計師節快樂。 今天要給大家分享的演算法是判斷二叉樹是否為完全二叉樹,相信大家對完全二叉樹的概念並不陌生,如果是順序儲存就會很方便,那鏈式儲存怎麼判斷呢,我的做法是:若

完全 陣列儲存 層次構造

對於完全二叉樹,如果將其中的元素按層次遍歷順序存放入一個一維陣列中:設陣列大小為n(節點數為n),節點標號(key)為陣列下標i,即0,1,2,3,4,,,那麼:1.完全二叉樹的高度為: ceil(log2(n+1))2.i = 0: 根節點,root,無父節點。 i >= 1: 父節點為 floor

軟考:資料結構基礎——建立順序完全

  首先是關於樹,二叉樹,完全二叉樹的一些知識 一、樹     (一)、基本概念            1. 度:一個節點的子樹的個數    &

假設中每個結點的值為單個字元, 設計一個演算法將一棵以鏈方式儲存 b 轉換成對應的順序儲存結構 a。——含具體實現工程

假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——李春葆資料結構第五版第七章,P246,第十題 思路解析: 解:設二叉樹的順序儲存結構型別為SqBTree,先將順序儲存結構a中所有元素置為‘#’(表示空結點)。將b轉