1. 程式人生 > >通過不斷的插入生成一棵二叉搜尋樹(C語言)

通過不斷的插入生成一棵二叉搜尋樹(C語言)

二叉搜尋樹:其各個節點的關鍵字碼必須是唯一的;若某結點左子樹非空,則左子樹上的所有節點的值均小於該結點的關鍵字碼,而其右子樹上的所有節點的值均大於該結點的關鍵字碼。所以,按照中序周遊整個二叉樹的可以得到一個由小到大的有序排列。

通過不斷讀取陣列中的資料而插入生成的二叉搜尋樹的程式碼如下:

/* 二叉搜尋樹 - 通過不斷插入建立一棵二叉搜尋樹 */

#include "stdafx.h"
#include <iostream>
#include <malloc.h>

using namespace std;
const int MaxSize = 5;

typedef int ElementType;
typedef struct bitnode
{
	ElementType data;
	struct bitnode *left, *right;
} bitnode, *bitree;            //bitree為指向struct bitnode這種結構的指標



bitree CreateByInsert(bitree T, int item);           //通過插入建立二叉搜尋樹

void InOrder(bitree T);                  //中序遞迴遍歷二叉搜尋樹、其結果一定為遞增序列

bitree FreeTree(bitree T);                //釋放二叉搜尋樹的記憶體空間



//通過插入建立二叉搜尋樹 
bitree CreateByInsert(bitree T, int item)
{
	if (T == NULL)        //樹為空,無根節點的情況,則分配一塊空的bitnode記憶體,建立根節點 
	{
		T = (bitree)malloc(sizeof(bitnode));
		if (T == NULL) cout << "分配記憶體失敗" << endl;
		else
		{
			T->data = item;
			T->left = T->right = NULL;
		}
	}
	else             //已有根節點,按照二叉搜尋樹的規定,比根節點大的往右放,比根節點小的往左放 
	{
		if (item < T->data)
			T->left = CreateByInsert(T->left, item);         //遞迴建立其左子樹 
		else if (item > T->data)
			T->right = CreateByInsert(T->right, item);       //遞迴建立其右子樹
		else   //T-data == item,什麼也不幹
		{ }
	}

	return T;                //返回根節點 
}

//中序遞迴遍歷 - 二叉搜尋樹的中序遍歷一定是遞增序列
void InOrder(bitree b)
{
	if (b)                 // b != NULL
	{
		InOrder(b->left);      //遞迴遍歷其左子樹 
		cout << b->data << " ";        //訪問根節點 
		InOrder(b->right);     //遞迴遍歷其右子樹 
	}
}

//釋放二叉搜尋樹的記憶體空間
bitree FreeTree(bitree T)
{
	if (T != NULL)
	{
		FreeTree(T->left);         //遞迴釋放其左子樹 
		FreeTree(T->right);       //遞迴釋放其右子樹 

		free(T);                 //釋放根節點指向的記憶體空間 
		T = NULL;                //釋放指向根節點的指標,避免野指標 
	}

	return T;
}

int main()
{
	int i;
	bitree root = NULL;                //注意要把根節點初始化為NULL 


	int array[MaxSize];
	cout << "請輸入這" << MaxSize << "個節點的資料(資料之間以空格隔開):";
	for (i = 0; i < MaxSize; i++)
		cin >> array[i];
	for (i = 0; i < MaxSize; i++)
		root = CreateByInsert(root, array[i]);

	cout << "二叉搜尋樹遞迴遍歷的結果:";
	InOrder(root);
	cout << endl;

	root = FreeTree(root);
	if (root == NULL)
		cout << "二叉搜尋樹釋放成功" << endl;

	return 0;
}
輸入輸出如下: 

相關推薦

通過不斷插入生成搜尋C語言

二叉搜尋樹:其各個節點的關鍵字碼必須是唯一的;若某結點左子樹非空,則左子樹上的所有節點的值均小於該結點的關鍵字碼,而其右子樹上的所有節點的值均大於該結點的關鍵字碼。所以,按照中序周遊整個二叉樹的可以得到一個由小到大的有序排列。通過不斷讀取陣列中的資料而插入生成的二叉搜尋樹的程

搜尋C語言

二叉搜尋樹又稱二叉排序樹,他或者是一顆空樹,或者是具有以下性質的二叉樹 1、若它的左子樹不為空,左子樹上所有節點的值都小於根節點上的值 2、若它的右子樹不為空,右子樹上所有節點的值都大於根節點上的值 它的左右子樹分別為二叉搜尋樹 用搜索關鍵字的方法先定義

04-4 是否同一搜尋 25 分

04-樹4 是否同一棵二叉搜尋樹 (25 分) 給定一個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列{2, 1, 3}和{2, 3, 1}插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入

7-4 是否同一搜尋25 分

給定一個插入序列就可以唯一確定一棵二叉搜尋樹。然而,一棵給定的二叉搜尋樹卻可以由多種不同的插入序列得到。例如分別按照序列{2, 1, 3}和{2, 3, 1}插入初始為空的二叉搜尋樹,都得到一樣的結果。於是對於輸入的各種插入序列,你需要判斷它們是否能生成一樣的二叉搜尋樹。

PTA 7-1 是否同一搜尋25 分 建樹比較

利用二叉樹性質 建樹,比較 #include<bits/stdc++.h> using namespace std; const int maxn = 1024 + 7; int n

輸入搜尋,將該搜尋轉換成一個排序的雙向連結串列劍指offer

題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 分析: 在二叉搜尋樹中,每個結點都有兩個分別指向其左、右子樹的指標,左子樹結點的值總是小於父結點的值,右子樹結點的值總是大於父結點的值。在雙向連結串列中,每個結點

[LeetCode] Trim a Binary Search Tree 修剪搜尋

Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so that all its elements lies in [L, R] (R >= L). You might

java 輸入搜尋,將該搜尋轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整中結點指標的指向。

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。 比如將二元查詢樹                       

資料結構實驗之查詢排序 SDUT 3373

二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),也稱二叉搜尋樹。 #include <stdio.h> #include <string.h> #include <stdlib.h> struct nod

”據結構搜尋Binary Search Tree, BST

前言 定義 來源 演算法 資料結構 查 遍歷 增 刪 總結 參閱 前言 想寫兩篇關於AVL樹和B樹的較為詳細的介紹,發現需要先介紹二叉搜尋樹作為先導。 定義 二叉搜尋樹(Binary Search Thee, BST),也被稱為二

6-21 是否搜尋 25 分

本題要求實現函式,判斷給定二叉樹是否二叉搜尋樹。 函式介面定義: bool IsBST ( BinTree T ); 其中BinTree結構定義如下: typedef struct TNode *Position; typedef Position BinTree; struct

7-2 是否完全搜尋 30 分

將一系列給定數字順序插入一個初始為空的二叉搜尋樹(定義為左子樹鍵值大,右子樹鍵值小),你需要判斷最後的樹是否一棵完全二叉樹,並且給出其層序遍歷的結果。 輸入格式: 輸入第一行給出一個不超過20的正整數N;第二行給出N個互不相同的正整數,其間以空格分隔。 輸出格式: 將輸入的N個正

浙大版《資料結構》習題4.3 是否搜尋 25 分

本題要求實現函式,判斷給定二叉樹是否二叉搜尋樹。 函式介面定義: bool IsBST ( BinTree T ); 其中BinTree結構定義如下: typedef struct TNode *Position; typedef Position BinT

資料結構與演算法 -- 搜尋java實現

package com.huang.test.datastructure; import java.util.*; /** * 二叉搜尋樹 */ abstract class BstData<T> { BstData<T> left;

LeetCode: 98. 驗證搜尋C++

題目: 給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。 一個二叉搜尋樹具有如下特徵: 節點的左子樹只包含小於當前節點的數。 節點的右子樹只包含大於當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜尋樹。 示例 1: 輸入: 2 / \ 1

資料結構之 查詢C語言實現

資料結構之 二叉查詢樹 1. 二叉查詢樹的定義 二叉查詢樹(binary search tree)是一棵二叉樹,或稱為二叉搜尋樹,可能為空;一棵非空的二叉查詢樹滿足一下特徵: 每個元素有一個關鍵字,並且任意兩個元素的關鍵字都不同;因此,所有的關鍵字都是唯

資料結構之排序C語言實現

一、基本概念1.二叉排序樹        二叉排序樹(Binary sort tree,BST),又稱為二叉查詢樹,或者是一棵空樹;或者是具有下列性質的二叉樹:        (1)若它的左子樹不為空,則左子樹上所有節點的值均小於它的根節點的值;        (2)若它的右

是否搜尋25 分

習題4.3 是否二叉搜尋樹(25 分)本題要求實現函式,判斷給定二叉樹是否二叉搜尋樹。函式介面定義:bool IsBST ( BinTree T ); 其中BinTree結構定義如下:typedef struct TNode *Position; typedef Positi

搜尋BST(C語言實現可用)

1:概述 搜尋樹是一種可以進行插入,搜尋,刪除等操作的資料結構,可以用作字典或優先順序佇列。二叉搜尋樹是最簡單的搜尋樹。其左子樹的鍵值<=根節點的鍵值,右子樹的鍵值>=根節點的鍵值。 如果共有n個元素,那麼每次操作需要的O(log n)的時間.       常用知識