1. 程式人生 > >二叉排序樹的建立與遍歷

二叉排序樹的建立與遍歷

二叉排序樹其實是一種排列方式,現在給定一系列的數,通過建立一個二叉樹,然後對二叉樹進行中序遍歷即可對二叉樹從小到大進行排列。

二叉樹大小節點大小:左節點的資料<根節點的資料<右節點的資料

1.定義二叉樹資料結構

我們採用int型別的作為節點內容

typedef struct node
{
	int data;             <span style="white-space:pre">	</span>//節點資料
	struct node* left;      //節點左指標
	struct node* right;     //節點右指標
}BSTree;
2.建立一顆二叉樹先定義一個數組,陣列中儲存未排序的資料,把第一個資料作為二叉樹的根節點,其餘的資料迴圈依次往後插入

往函式中傳入二叉樹根節點,陣列,陣列長度。

void CreateBSTree(BSTree* t,int data[],int length)
{
	t->data=data[0];
	t->left=t->right=NULL;

	for(int i=1;i<length;i++)
	{
		insertNode(t,data[i]);
	}
}
3.遍歷插入二叉樹節點(重點)

類似連結串列的操作,定義一個分配記憶體的指標,這個指標不斷開闢新的記憶體,生成節點資料,定義一個臨時指標用來遍歷,查詢用來插入的位置,定義一個連線指標,用來連線二叉樹

void insertNode(BSTree* t,int key)
{
	BSTree *p,*Parent,*Head;            //p指標為開闢記憶體的指標,不斷開闢新的記憶體,Head指標對二叉樹進行遍歷,尋找插入的位置,parent用來連線新節點
	p=(BSTree*)malloc(sizeof(BSTree));
	p->data=key;
	p->left=p->right=NULL;

	Head=t;            //Head指標指向根節點,每次都是從根節點進行遍歷
	while(Head)
	{
		Parent=Head;         //這裡一定要定義2個指標,一個指標是無法解決的
		if(key<Head->data)
			Head=Head->left;//如果只定義了Head指標,使用Head指標來連線的話,繼續遍歷Head=Head->left,最後葉子節點是空指標,空指標當然無法連線節點,需要用Parent指標來儲存進行連線才行,新值小於根節點,往左遍歷,大於根節點,往右遍歷
		else
			Head=Head->right;
	}

	if(key<Parent->data)   //注意不是head,一定要用Parent個連線
		Parent->left=p; //連線節點  //新值小於根節點,連線在左子樹,否則連線在右子樹
	else
		Parent->right=p;
}
4.中序遍歷輸出,這個很簡單,遍歷即可
void LRD(BSTree* t)  
{
	if(t) //這個千萬不能掉,否則為空報錯
	{	
		LRD(t->left);
		printf("%d\n",t->data);
		LRD(t->right);
	}
}
5.實際呼叫過程
int sourec[10]={89,21,2,32,12,121,3,89,45,90};
BSTree *t=(BSTree*)malloc(sizeof(BSTree)); 	
CreateBSTree(t,sourec,10);
LRD(t);

或者寫成
BSTree t,
只不過改成
CreateBSTree(&t,sourec,10);
LRD(&t);



相關推薦

C++建立

注意:二叉樹建立時要用指標的引用,詳解參考:#include <iostream> using namespace std; struct BiNode { char data; BiNode *lchild, *rchild; }; void Creat

搜尋的構建,,查詢,刪除

轉載請註明出處: 百度面試很喜歡問樹,直接被虐慘。有必要對資料結構中的各種樹進行仔細的研究。本篇部落格重點研究二叉搜尋樹。 資料結構中為了儲存和查詢的方便,用各種樹結構來儲存資料,下面就淺談一下各種樹的表示方法、特點及各自的用途,涉及的樹結構包括:二

B建立

# include <stdio.h> # include <stdlib.h> # include "btrees.h" /* 給一個結點分配空間 */ struct btnode * allocateNode(struct btnode *

搜尋(排序)BST雙向列表的轉換

目錄 1.二叉排序樹(Binary Sort Tree) 二叉排序樹又稱二叉查詢樹(Binary Search Tree) BST 二叉排序樹或者是一顆空樹,或者是滿足一下性質的一顆二叉樹: 若它的左子樹非空,則左子樹上

搜尋的後續序列

題目 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 程式碼 public boolean VerifySquenceOfBST(int [] sequence) {

排序建立(JAVA實現)

      最近看了一下二叉排序樹的建立,自己寫了一段程式碼,用來建立二叉排序樹,給定一個數組,對這個陣列中的數字進行建立二叉排序樹。分兩種情況:      1  陣列中的數字是隨機的,也就是說沒有順序 eg : int  a [ ] = {3,1,2,5,0,7,9,8}

一維維陣列的建立

一、一維陣列的建立與遍歷 方法一: 型別[ ]變數=new 型別[ ];l例如:string a=new string[ var int] 若使用new關鍵字,則方括號內必須宣告一個int型別的值來表示長度 也可以:string[ ] a=new string[

劍指Offer-Python-搜尋的後續序列

題目:二叉搜尋樹的後續遍歷序列 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路:二叉搜尋樹的特點是,左子樹的值小於根節點的值,右子樹的值大於根節點的值。

搜尋層序C語言

  層序遍歷,寫完了,感慨下.   不同於前序遍歷,中序遍歷,後序遍歷,層序遍歷沒有使用棧模式,而是使用了佇列.   佇列中的資料,即QueueItem是二叉搜尋樹結點指標,這樣可以儲存結點,並且可以方便處理棧為空時返回值的問題.也就是可以返回NULL.   用一個函式實現,

排序建立

二叉排序樹其實是一種排列方式,現在給定一系列的數,通過建立一個二叉樹,然後對二叉樹進行中序遍歷即可對二叉樹從小到大進行排列。 二叉樹大小節點大小:左節點的資料<根節點的資料<右節點的資料 1.定義二叉樹資料結構 我們採用int型別的作為節點內容 typedef

排序建立中序

編譯器:Xcode 程式語言:C data1.txt文字資料為上圖,在我的電腦裡它的儲存位置是:/Users/wsw/Desktop/資料結構/data1.txt #include<

[]排序建立先序

描述: 採用二叉連結串列方式儲存二叉排序樹。從空樹開始,將輸入元素按照輸入順序逐個插入一顆二叉排序樹,以生成二叉排序樹,並輸出先序遍歷的結果。 輸入說明 第一行為整數n,表示將輸入n個數字。第二行為n個整數,為輸入資料,n個整數間用空格隔開。 輸

【資料結構】建立(遞迴)

該程式全是使用遞迴的操作 執行環境是:Dev-C++ #include <stdio.h> #include <stdlib.h> typedef struct node{ char data; struct node *lchild,*rchild; }bi

建立(先序,中序,後序,層次)

#include<stdio.h> #include<stdlib.h> typedef struct BitNode { char data; struct BitNode *lchild,*rchild; }BitNode; BitNode* Crea

排序建立,查詢,

1 #include<stdio.h> 2 #include <iostream> 3 #include<algorithm> 4 using namespace std; 5 #define MAXSIZE 100 6 typedef int KeyTy

學習筆記 c++ (用類來實現建立

       程式碼: #include<iostream> #include<stdio.h> using namespace std; class BiTree { public:     char data;     BiTree *

【資料結構週週練】010 遞迴演算法實現建立

一、前言 上兩篇週週練部落格講了二叉樹的建立與遍歷,建立時,通過建立棧來存放結點,方便二叉樹的建立,這種建立二叉樹的方式採用了非遞迴演算法,本次內容採用遞迴的方式來建立二叉樹,大家可以通過對比程式碼量,感受一下遞迴的魅力。同時遍歷過程也是通過遞迴演算法。 如果大家第一次看

建立

#include<iostream> #include<cstring> #include<conio.h> #include<cstdlib> #define OK 1 #define ERROR 0 #define OVER

線索建立C/C++

一、線索二叉樹的定義 在採用二叉樹連結串列做儲存結構時,二叉樹中的所有節點共有n+1個空指標域。因此可以利用二叉樹的二叉樹連結串列儲存結構中的那些空指標域來指示節點在某種遍歷序列中直接前驅和直接後繼的位置資訊。這些指向直接前驅節點和直接後繼節點的指標被稱為線

排序的基本操作(建立,中序,查詢,刪除,插入)

分析: 二叉排序樹的操作的難點在於刪除操作,刪除操作時,只需要滿足二叉排序樹的性質即可,即需要找到要刪除結點p的左孩子的最右下方的數替代該結點的資料,然後刪除p->lchild的最右下方的結點即可。 對於p->lchild==NULL的,只需要讓雙親結點直接指向