1. 程式人生 > >C#實現二叉查詢樹

C#實現二叉查詢樹



    /// <summary>
    /// 二叉樹節點的定義
    /// </summary>
    public class Node
    {
        //本身的資料
        public int data;
        //左右節點
        public Node left;
        public Node right;

        public void DisplayData()
        {
            Console.Write(data + "  ");
        }
    }

    public class BinarySearchTree
    {

        Node rootNode = null;

        public void Insert(int data)
        {
            Node parent;
            //包裝資料進節點
            Node newNode = new Node();
            newNode.data = data;
            //根節點
            if (rootNode == null)
            {
                rootNode = newNode;
            }
            //找到合適的子節點位置插入
            else
            {
                Node currentNode = rootNode;
                while (true)
                {
                    parent = currentNode;
                    if (newNode.data < currentNode.data)
                    {
                        currentNode = currentNode.left;
                        if (currentNode == null)
                        {
                            parent.left = newNode;
                            break;
                        }
                    }
                    else
                    {
                        currentNode = currentNode.right;
                        if (currentNode == null)
                        {
                            parent.right = newNode;
                            break;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 中序遍歷
        /// </summary>
        /// <param name="theRoot"></param>
        public void InOrder(Node theRoot)
        {
            if (theRoot != null)
            {
                InOrder(theRoot.left);
                theRoot.DisplayData();
                InOrder(theRoot.right);
            }
        }
        //先序遍歷
        public void PreOrder(Node theRoot)
        {
            if (theRoot != null)
            {
                theRoot.DisplayData();
                PreOrder(theRoot.left);
                PreOrder(theRoot.right);
            }
        }
        //後序遍歷
        public void PostOrder(Node theRoot)
        {
            if (theRoot != null)
            {
                PostOrder(theRoot.left);
                PostOrder(theRoot.right);
                theRoot.DisplayData();
            }
        }


        public void FindMax()
        {
            Node current = rootNode;
            //找到最右邊的即可
            while (current.right != null)
            {
                current = current.right;
            }
            Console.WriteLine("max:" + current.data);
        }

        public void FindMin()
        {
            Node current = rootNode;
            //找到最左邊的節點即可
            while (current.left != null)
            {
                current = current.left;
            }
            Console.WriteLine("min:" + current.data);
        }

        public Node Search(int i)
        {
            Node current = rootNode;
            while (true)
            {
                if (i < current.data)
                {
                    if (current.left == null) break;
                    current = current.left;
                }
                else if (i > current.data)
                {
                    if (current == null) break;
                    current = current.right;
                }
                else
                {
                    return current;
                }
            }

            if (current.data != i)
            {
                return null;
            }
            return current;
        }

        public Node Delete(int key)
        {
            Node parent = rootNode;
            Node current = rootNode;
            //首先找到需要被刪除的節點和其父節點
            while (true)
            {
                if (key < current.data)
                {
                    if (current.left == null) break;
                    parent = current;
                    current = current.left;
                }
                else if (key > current.data)
                {
                    if (current == null) break;
                    parent = current;
                    current = current.right;
                }
                else
                {
                    break;
                }
            }

            //找到被刪除的節點後,分四種情況

            //1.當是子節點的時候,直接刪除
            if (current.left == null && current.right == null)
            {
                if (current == rootNode && rootNode.left == null && rootNode.right == null)
                {
                    rootNode = null;
                }
                else if (current.data < parent.data)
                {
                    parent.left = null;
                }
                else
                {
                    parent.right = null;
                }
            }
             //所刪除的節點只有左節點的時
            else if (current.left != null && current.right == null)
            {
                if (current.data < parent.data)
                    parent.left = current.left;
                else
                    parent.right = current.left;
            }
            //所刪除的節點只有右節點時
            else if (current.left == null && current.right != null)
            {
                if (current.data < parent.data)
                    parent.left = current.right;
                else
                    parent.right = current.right;
            }
            //當刪除的節點有左右節點的時候
            else
            {
                //current是被刪除的節點,temp是被刪左子樹最右邊的節點
                Node temp;
                //先判斷是父節點的左節點還是右節點
                if (current.data < parent.data)
                {
                    parent.left = current.left;
                    temp = current.left;
                    //尋找被刪除節點最深的右孩子
                    while (temp.right != null)
                    {
                        temp = temp.right;
                    }
                    temp.right = current.right;
                }
                //右節點
                else if (current.data > parent.data)
                {
                    parent.right = current.left;
                    temp = current.left;
                    //尋找被刪除節點最深的左孩子
                    while (temp.left != null)
                    {
                        temp = temp.left;
                    }
                    temp.right = current.right;
點選開啟連結
} //當被刪節點是根節點,並且有兩個孩子時 else { temp = current.left; while (temp.right != null) { temp = temp.right; } temp.right = rootNode.right; rootNode = current.left; } } return current; } }


相關推薦

C#實現查詢

/// <summary> /// 二叉樹節點的定義 /// </summary> public class Node { //本身的資料 public int dat

C++:查詢實現)——遍歷操作

     建立好二叉樹,有時候我們需要對整個二叉樹錦星遍歷,即輸出二叉樹的所有結點元素。理論上,遍歷的方式有無數種,順序可以自己任意選定,但是絕大部分遍歷方式在實際中並沒有用處,比較有用的的遍歷方式有兩種:廣度優先遍歷、深度優先遍歷。 (1)廣度優先遍歷        

[C語言實現]實現查詢基本操作(遞迴版,圖示)

定義 二叉查詢樹是一種特殊的二叉樹,它不僅是一顆二叉樹,還滿足如下性質 對於任何非葉子節點,他的左節點都小於它本身,而右節點都大於其本身. 它的左右子樹也分別而二叉搜尋樹 一般情況下,在這麼一棵樹中進行查詢,它的時間複雜度是 longnlon

C語言實現查詢(BST)的基本操作

     我們在上一篇部落格中講解了二叉樹,這一次我們來實現二叉樹的進階——二叉查詢樹(Binary Search Tree),又稱二插排序樹(Binary Sort Tree)。所以簡稱為BST。二插查詢樹的定義如下:1.若左子樹不為空,則左子樹上所有節點的值均小於它的根節

C++實現排序BSTree --插入刪除摧毀查詢等操作

#ifndef _BSTREE_H #define _BSTREE_H #include <iostream> #include <assert.h> using namespace std; template <typename T> class BSTree; t

C語言實現查詢的輸出

二叉樹是資料結構和演算法中的重要部分。本文將簡單介紹其中的一類——二叉查詢樹:         二叉排序樹(BinarySortTree),又稱二叉查詢樹、二叉搜尋樹。它或者是一棵空樹;或者是具有下列

JS 實現查詢(Binary Search Tree)

知識點 二叉查詢樹,也稱二叉搜尋樹、有序二叉樹(英語:ordered binary tree)是指一棵空樹 任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 任意節點的左、

python3 實現查詢的搜尋、插入、刪除

1. 定義 二叉查詢樹(Binary Search Tree),又稱為二叉搜尋樹、二叉排序樹。其或者是一棵空樹;或者是具有以下性質的二叉樹: 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 若右子樹不空,則右子樹上所有結點的值均大於或等於它的

C++實現排序

1.定義 二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),亦稱二叉搜尋樹。 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; (2)若右子樹不空,則右子樹上所

前端你也需要了解的演算法,概念及JS實現查詢

前述:樹是電腦科學中經常用到的一種資料結構。樹是一種非線性的資料結構,以分層的形式儲存資料。樹被用來儲存具有層級關係的資料結構,比如檔案系統中的檔案;樹還被用來儲存有序列表。 樹的定義 樹是由一組以邊連線的節點組成。公司的組織結構圖就是一個樹的例子。 二叉樹 二叉

js實現查詢的建立、插入、刪除、遍歷操作

1 概念 二叉排序樹(二叉查詢樹),它或者是一顆空樹,或者是具有以下性質的二叉樹: 任意一個結點左子樹上的所有結點值均小於該結點值 任意一個結點右子樹上的所有結點值均大於該結點值 例如下圖: 2 插入和建立二叉排序樹 結點的資料結構 fu

C++實現搜尋(遞迴&非遞迴)

二叉搜尋樹(Binary Search Tree)的性質: 1、每個節點都有一個作為搜尋關鍵碼的key,並且所有節點的key都不相同。 2、左子樹上的key值都小於根節點的key值。 3、右子樹上的key值都大於根節點的key值。 4、左右子樹都是二叉搜

C++實現搜尋排序)模板類

參考了Weiss的資料結構與演算法分析C++描述第三版 在中文版中,第99頁貌似有個錯誤。在4.3.6 平均情況分析中,書上寫的是“直觀地,我們期望前一節所有的操作特別是makeEmpty 和 operator=都花費O(logN)時間,……”,我感覺不太對,因為make

python實現查詢

1. 定義 二叉查詢樹(Binary Search Tree),又稱為二叉搜尋樹、二叉排序樹。其或者是一棵空樹;或者是具有以下性質的二叉樹: 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 若右子樹不空,則右子樹上所有結點的值均大於或等於它

java實現查詢(插入、刪除、遍歷、查詢)

閒話: 繼續擼資料結構和演算法。看資料結構推薦一個視覺化工具吧(http://visualgo.net/),沒有圖憑腦袋想是很痛苦的。 正文: 二叉查詢樹,也叫二叉搜尋樹、有序二叉樹,排序二叉樹,滿足以下性質(非嚴謹描述):       1.對於每個節點,其左子節點要麼

java實現查詢

package ustc.zyy.ArrayList; /** * @author zhang yin ye * @date 2014 6 17 * */ import java.util.DuplicateFormatFlagsException; pu

查詢查詢、插入、刪除、釋放等基本操作的實現C語言)

二叉查詢樹是一種特殊性質的二叉樹,該樹中的任何一個節點,它的左子樹(若存在)的元素值小於節點的元素值,右子樹(若存在)的元素值大於節點的元素值。 實現了二叉樹查詢樹的實現以及基本操作,包括查詢、插入、刪除、初始化、釋放等。 原始碼下載地址:http://download.c

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

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

資料結構——查詢的詳細實現(c++)

本文實現了二叉查詢樹的前序遍歷(遞迴與非遞迴)、中序遍歷(遞迴與非遞迴)、後序遍歷(遞迴與非遞迴)、插入過程、刪除過程、查詢過程等。 二叉樹的簡單介紹: 1、二叉樹中的每個節點都不能有多餘兩個的兒子。 2、二叉樹的深度要比N小得多。 假設每個節點被指

c++實現的插入、刪除、查詢、遍歷和樹形列印

binary_tree.h 宣告 #ifndef BINARY_TREE #define BINARY_TREE #include "util.h" template<typename T> class tree_node { public: tree_