1. 程式人生 > >搜尋二叉樹的定義及操作

搜尋二叉樹的定義及操作

一.定義:
二叉搜尋樹是滿足以下性質的二叉樹。
1.非空左子樹的所有鍵值小於其根結點的鍵值;
2.非空右子樹的所有鍵值大於其根結點的鍵值;
3.左右子樹都是二叉樹。

二.二叉搜尋樹的儲存:
二叉搜尋樹的儲存和普通二叉樹的儲存一樣,一般用連結串列儲存。

三.二叉搜尋樹的查詢:
1.查詢關鍵字為X的結點,返回其所在的地址:
將X值與結點值做對比,如果相等那麼這個數找到,如果小於應該再遞迴在左子樹上找,如果大於應該再遞迴在右子樹上找,如果遞迴到所有結點為空,那麼停止查詢。

BinTree Find(int x, BinTree BST)
{
    if(!BST)
        return
NULL; //沒找到 if(x > BTS->Data) return Find(x,BST->Right); else if(x < BTS->Data) return Find(x,BST->Left); else return BST; //找到,返回地址 }

2.查詢二叉搜尋樹的最大和最小元素
最大元素和最小元素分別在最右端點和最左端點。
不斷往左(右)遞迴,找到最左(右)端點即可。
最小元素:

BinTree FindMin(BinTree BST)
{
    if
(!BST) return NULL; //空樹 if(!BST->Left) return BST; else return FindMin(BST->Left); }
BinTree FindMin(BinTree BST)
{
    if(BST)
    {
        while(BST->Left)
            BST = BST->Left;
    }
    return BST;
}

最大元素是把Left改成Right;

四.二叉搜尋樹的插入和刪除
1.插入操作:將元素X插入二叉搜尋樹關鍵找到元素應該插入的位置。
將X值與結點值做對比,如果相等那麼這個數已經存在,如果小於應該再遞迴在左子樹上找,如果大於應該再遞迴在右子樹上找,如果找到結點為空,那麼將結點賦值。

BinTree Insert( BinTree BST, ElementType X )
{
    if(!BST)
    {
        BST = (BinTree)malloc(sizeof(struct TNode));
        BST->Data = X;
        BST->Left = BST->Right = NULL;
    }
    else
    {
        if(X < BST->Data)
            BST->Left = Insert(BST->Left,X);
        else if(X > BST->Data)
            BST->Right = Insert(BST->Right,X);
    }
    return BST;
}

2.刪除操作:
如果沒找到不處理,如果查詢到那個點,繼續操作:如果左右子樹都非空,那麼查詢左子樹的最大值(右子樹的最小值)代替這個刪去的位置,並再刪去這個我們用來代替的數的原來位置;如果只有左子樹(右子樹)非空,那麼用左子樹(右子樹)的根代替,如果本身就是葉子結點那麼刪去即可。

BinTree Delete( BinTree BST, ElementType X )
{
    BinTree Tmp;
    if(!BST)
    {
        puts("Not Found");
        return NULL;
    }
    else
    {
        if(X < BST->Data)
            BST->Left = Delete(BST->Left,X);
        else if(X > BST->Data)
            BST->Right = Delete(BST->Right,X);
        else
        {
            if(BST->Right && BST->Left)
            {
                Tmp = FindMin(BST->Right);
                //Tmp = FindMax(BST->Left);
                BST->Data = Tmp->Data;
                BST->Right = Delete(BST->Right,Tmp->Data);
                //BST->Left = Delete(BST->Left,Tmp->Data);
            }
            else
            {
                if(!BST -> Left)
                    BST = BST->Right;
                else if(!BST -> Right)
                    BST = BST->Left;
            }
        }
    }
    return BST;
}

相關推薦

定義相關術語、節點數計算公式、程式碼實現(遍歷,Java版)

二叉樹 定義:二叉樹是由n(n>=0)個節點組成的有限集,或者為空樹(n=0),或者為由一個根節點和兩個分別稱為左子樹和右子樹的的互不相交的二叉樹構成。 特點:(1).每個節點最多能有兩棵子樹,即左子樹和右子樹。              (2).左子樹和右子樹有次序

搜尋定義操作

一.定義: 二叉搜尋樹是滿足以下性質的二叉樹。 1.非空左子樹的所有鍵值小於其根結點的鍵值; 2.非空右子樹的所有鍵值大於其根結點的鍵值; 3.左右子樹都是二叉樹。 二.二叉搜尋樹的儲存:

C語言_的基本操作常見面試題

本片部落格主要包含以下內容: 和二叉樹操作相關的佇列基本操作 初始化 入佇列 判斷佇列是否為空 出佇列,返回對頭元素 和二叉樹相關的棧的基本操作 初始化 入棧 出棧 判空 返回棧頂元素並出棧 返回棧頂元素不出棧

搜尋,平衡,堆三者插入刪除操作分析總結

引言:搜尋二叉樹,平衡二叉樹,堆三者插入刪除操作在選擇題中經常出現,很容易混淆 所以在這裡就簡單總結一下: 一.搜尋二叉樹 定義:二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子

c++ 搜尋 插入,刪除,遍歷操作

搜尋二叉樹是一種具有良好排序和查詢效能的二叉樹資料結構,包括多種操作,本篇只介紹插入,排序(遍歷),和刪除操作,重點是刪除操作比較複雜,用到的例子也是本人親自畫的 用到的測試圖資料例子 第一、構建節點 1 template <typename T> class B

的基本操作一下問題(指標和終止輸入)

1.為什麼建立二叉樹時使用二級指標? C都是值傳遞,只傳指標相當於把外部指標的地址傳入了而已,在函式內部你又建立了一個指標,也是指向那個地址,操作完後,其實只是改變了你建立的指標,並未改變外部的指標。 如同這一個函式,並未交換兩個值。 你要改變的是指標的地址,那就要用到

的基本操作哈夫曼編碼譯碼的實現(實驗

實驗目的: 1.掌握二叉樹的二叉連結串列儲存表示及遍歷操作實現方法。 //完成二叉樹的建立,先序遍歷,中序遍歷,後續遍歷 #include<iostream> #include<cstring> using namespace

相關操作

class BinTree(): def __init__(self,root=None,left=None,right=None): self._root=root # 初始化

——定義

color 二叉 來源 col tree round 描述 目錄 樹和二叉樹 樹形結構是一類重要的非線性結構數據結構。其中以樹和二叉樹最為常用,直觀看來,樹是以分支關系定義的層次結構。 樹的定義與基本術語   樹的結構定義是一個遞歸定義,即在樹的定義中又用到樹的概念。除了樹

C 的一些操作

今天不開森,自行車在樓下被偷了 文章目錄 二叉樹的建立 二叉樹的先序遍歷 二叉樹的中序遍歷 二叉樹的後序遍歷 看看有多少個葉子節點(度為0的節點) 總共有多少個節點 二叉樹的高度 度為1的節點個數 度為2的節點個數

【資料結構】的相關操作(待更)

#include "stdio.h" #include "stdlib.h" typedef struct node { char data; struct node *rchild,*lchild; }bintnode; typedef bintnode *bintree;//指向該結構體

搭建先序、中序、後序遍歷(JAVA)

                 A         &

的相關操作(c語言)

二叉樹的相關操作:包括先序序列+中序序列建樹丶後序序列+中序序列建樹丶層次序列+中序序列建樹;先序遍歷丶中序遍歷丶後序遍歷丶層次遍歷;二叉樹的深度及最大寬度;度分別為0,1,2的節點個數以及總結點個數 #include<stdio.h> #include<malloc.h> #i

【資料結構】搜尋的key-value模型

文章目錄 1. 採用key-value模型判斷一個單詞是否拼寫正確,並且顯示翻譯。 BSVTree.h BSVTree.c 2. 採用key-value模型求出輸入單詞重複出現的次數? BSV

的基本操作(資料結構)

二叉樹的基本操作(資料結構) 看了很多部落格許多大牛的文章,發現他們的方法即巧妙又簡便,果斷學習並理解。結合所學的知識,把二叉樹的基本操作羅列了下來。 廢話不多說,直接上原始碼,一些不容易理解的地方會有註釋,要是有問題也可以私信我QQ``:790567648交個朋友互相學習鴨~ --

資料結構——線索的基本操作

線索二叉樹的基本操作 #include<stdio.h> #include<stdlib.h> typedef struct Node{ //二叉樹的鏈式儲存結點 char data; struct Node *Lchild; struct

資料結構 筆記:中屬性操作的實現

二叉樹的屬性操作 count() = 10; height() = 4; degree() = 2; 二叉樹結點的數目 -定義功能:count(node) ·在node為根結點的二叉樹中統計結點數目 int count(BTreeNode<T>* nod

第八十六題(搜尋建立)

如何編寫一個程式,把一個有序整數陣列放到二叉樹中? 分析:為了讓搜尋二叉樹的查詢等操作接近於O(log(n))。我們以有序陣列的中間位置的數字作為搜尋二叉樹的根節點,以其左半部分資料建立搜尋二叉樹作為根節點的左子樹。以其有半部分資料建立搜尋二叉樹作為根節點的右子樹。這是一個遞

線索的基本操作

(1)二叉樹的線索化 (2)對線索二叉樹進行中序遍歷 #include<iostream> using namespace std; typedef char TElemType; enum Status {OK = 1,ERROR = 0}; enum Pointer

pat(甲)1064--(搜尋+滿

1064 Complete Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper