BST:二叉排序樹演算法
建立二叉排序樹,實現樹的插入、刪除,前、中、後序遍歷(遞迴方式)等操作。
- #include <iostream>
- #include "Binary_Tree.h"
- usingnamespace std;
- int main()
- {
- int N = 0;
- int *data;
- cout << "N = ";
- cin >> N;
- data = (int *)malloc(N * sizeof(int));
- cout << "資料:";
- for (int i = 0; i < N; ++i)
- {
- cin >> data[i];
- }
- //30 12 54 8 24 35 70 19 28 48
- //30 12 54 24 35 70 19 28 48 37 36 38
- BT BTree;
- BTree.Create_Binary_Sort_Tree(data, N);
- while(1)
- {
- cout << "1.遍歷\t2.插入\t3.刪除\t4.退出"<<endl;
- cout <<"選擇:";
- int choice;
- cin >> choice;
- switch(choice)
- {
- case 1:
- cout << "前序:";
- BTree.Pre_Oder_Traverse(BTree.root);
- cout << endl;
- cout << "中序:";
- BTree.In_Oder_Traverse(BTree.root);
- cout << endl;
- cout << "後序:";
- BTree.Post_Oder_Traverse(BTree.root);
- cout << endl;
- break;
- case 2:
- cout << "插入:";
- int value;
- cin >> value;
- BTree.Insert_Elem(value);
- break;
- case 3:
- cout << "刪除:";
- cin >> value;
- BTree.Delete_Elem(value);
- break;
- case 4:
- return 0;
- break;
- default:
- break;
- }
- }
- return 0;
- }
- /*****************************************
- Copyright (c) 2015 Jingshuang Hu
- @filename:Binary_Tree.h
- @datetime:2015.11.03
- @author:HJS
- @e-mail:[email protected]
- @blog:http://blog.csdn.net/hujingshuang
- *****************************************/
- #ifndef _BINARY_TREE_H_
- #define _BINARY_TREE_H_
- #include <iostream>
- usingnamespace std;
- struct Tree
- {
- int elem;
- Tree *left;
- Tree *right;
- };
- class BT
- {
- public:
- BT(); //建構函式
- void Create_Binary_Sort_Tree(int *, int); //建立二叉樹
- void Pre_Oder_Traverse(Tree *); //前序
- void In_Oder_Traverse(Tree *); //中序
- void Post_Oder_Traverse(Tree *); //後序
- void Insert_Elem(int); //插入
- void Delete_Elem(int); //刪除
- // void Show_Tree(void); //顯示二叉樹
- // virtual void Level_Oder_Traverse(Tree *) = 0; //純虛擬函式
- //private:
- Tree *root;
- };
- #endif
- /*****************************************
- Copyright (c) 2015 Jingshuang Hu
- @filename:Binary_Tree.cpp
- @datetime:2015.11.03
- @author:HJS
- @e-mail:[email protected]
- @blog:http://blog.csdn.net/hujingshuang
- *****************************************/
- #include "Binary_Tree.h"
- //初始化二叉樹
- BT::BT()
- {
- root = NULL;
- }
- //建立二叉樹
- void BT::Create_Binary_Sort_Tree(int *data, int N)
- {
- Tree *nowfreenode = new Tree; //生成新的節點
- Tree *prefreenode = new Tree;
- root = new Tree;
- root->elem = data[0]; //父節點元素
- root->left = root->right = NULL; //左右孩子為空
- //30 12 54 8 24 35 70 19 28 48
- for (int i = 1; i < N; ++i)
- {
- nowfreenode = root;
- Tree *newnode = new Tree; //生成新的節點
- newnode->elem = data[i];
- newnode->left = newnode->right = NULL;
- while(nowfreenode != NULL) //空
- {
- prefreenode = nowfreenode; //用於記錄前一個節點
- if (newnode->elem < nowfreenode->elem) //掛在左邊
- {
- nowfreenode = nowfreenode->left;
- }
- else
- {
- nowfreenode = nowfreenode->right; //掛在右邊
- }
- }
- if (newnode->elem < prefreenode->elem)
- {
- prefreenode->left = newnode;
- }
- else
- {
- prefreenode->right = newnode;
- }
- }
- delete nowfreenode;
- // delete prefreenode;
- }
- //前序
- void BT::Pre_Oder_Traverse(Tree *T)
- {
- if (T != NULL)
- {
- cout << T->elem << " ";
- Pre_Oder_Traverse(T->left);
- Pre_Oder_Traverse(T->right);
- }
- }
- //中序
- void BT::In_Oder_Traverse(Tree *T)
- {
- if (T != NULL)
- {
- In_Oder_Traverse(T->left);
- cout << T->elem << " ";
- In_Oder_Traverse(T->right);
- }
- }
- //後序
- void BT::Post_Oder_Traverse(Tree *T)
- {
- if (T != NULL)
- {
- Post_Oder_Traverse(T->left);
- Post_Oder_Traverse(T->right);
- cout << T->elem << " ";
- }
- }
- //插入
- void BT::Insert_Elem(int data)
- {
- Tree *nowfreenode = new Tree;
- Tree *prefreenode = new Tree;
- nowfreenode = root;
- Tree *newnode = new Tree; //生成新的節點
- newnode->elem = data;
- newnode->left = newnode->right = NULL;
- while(nowfreenode != NULL) //空
- {
- prefreenode = nowfreenode; //用於記錄前一個節點
- if (newnode->elem < nowfreenode->elem) //掛在左邊
- {
- nowfreenode = nowfreenode->left;
- }
- else
- {
- nowfreenode = nowfreenode->right; //掛在右邊
- }
- }
- if (newnode->elem < prefreenode->elem)
- {
- prefreenode->left = newnode;
- }
- else
- {
- prefreenode->right = newnode;
- }
- }
- //刪除
- void BT::Delete_Elem(int data)
- {
- Tree *prefreenode = new Tree;
- Tree *nowfreenode = new Tree;
- nowfreenode = root;
- Tree *newnode = new Tree;
- newnode->elem = data;
- newnode->left = newnode->right = NULL;
- prefreenode = nowfreenode;
- //找到元素所在節點nowfreenode
- while((nowfreenode != NULL) && (newnode->elem != nowfreenode->elem))
- {
- prefreenode = nowfreenode;
- if (newnode->elem < nowfreenode->elem) //往左走
- {
- nowfreenode = nowfreenode->left;
- }
- elseif (newnode->elem > nowfreenode->elem) //往右走
- {
- nowfreenode = nowfreenode->right;
- }
- }
- //
- if ((nowfreenode->left != NULL) && (nowfreenode->right == NULL))//只有左子樹,用左子樹代替節點
- {
- if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))
- {
- prefreenode->left = nowfreenode->left;
- }
- else
- {
- if (prefreenode == nowfreenode)
- {
- root = nowfreenode->left;
- }
- else
- {
- prefreenode->right = nowfreenode->left;
- }
- }
- }
- elseif ((nowfreenode->left == NULL) && (nowfreenode->right != NULL))//只有右子樹,用右子樹代替節點
- {
- if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))
- {
- prefreenode->left = nowfreenode->right;
- }
- else
- {
- if (prefreenode == nowfreenode)
- {
- root = nowfreenode->right;
- }
- else
- {
- prefreenode->right = nowfreenode->right;
- }
- }
- }
- elseif ((nowfreenode->left == NULL) && (nowfreenode->right == NULL))//是葉子節點,直接刪除
- {
- if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))
- prefreenode->left = NULL;
- else
- prefreenode->right = NULL;
- }
- else//左右子樹都存在,用左子樹最右節點代替節點
- {
- prefreenode = nowfreenode;
- nowfreenode = nowfreenode->left;
- Tree *pfreenode = prefreenode;
- while(nowfreenode->right != NULL)
- {
- pfreenode = nowfreenode;
- nowfreenode = nowfreenode->right;
- }
- prefreenode->elem = nowfreenode->elem;
- pfreenode->right = nowfreenode->left;
- delete prefreenode;
- }
- // delete nowfreenode;
- }
相關推薦
【資料結構】BST:二叉排序樹演算法
建立二叉排序樹,實現樹的插入、刪除,前、中、後序遍歷(遞迴方式)等操作。 /***************************************** Copyright (c) 2015 Jingshuang Hu @filename:dem
BST:二叉排序樹演算法
建立二叉排序樹,實現樹的插入、刪除,前、中、後序遍歷(遞迴方式)等操作。 #include <iostream>#include "Binary_Tree.h"usingnamespace std; int main() { int
Android版資料結構與演算法(八):二叉排序樹
本文目錄 前兩篇文章我們學習了一些樹的基本概念以及常用操作,本篇我們瞭解一下二叉樹的一種特殊形式:二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),亦稱二叉搜尋樹。 一、二叉排序樹定義 二叉排序樹或者是一顆空樹,或者是具有下列性質的二叉樹:
資料結構與演算法:二叉排序樹
二叉排序樹 二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),亦稱二叉搜尋樹。是資料結構中的一類。在一般情況下,查詢效率比連結串列結構要高。 二叉排序樹的定義: 當左子樹不為空時,左子樹上的所有節點值都小於左子樹的根節點值 當右子樹不為空時,右子樹
BST(二叉排序樹)的插入與刪除
最小值 temp def oot gpo 一個 記錄 通過 如果 值得一說的是刪除操作,刪除操作我們分為三種情況: 1.要刪的節點有兩個孩子: 找到左子樹中的最大值或者右子樹中的最小值所對應的節點,記為node,並把node的值賦給要刪除的節點del,然後刪除node
C++ 判斷一顆樹騰訊分是分網站開發否是BST(二叉排序樹)
sizeof 存儲 tno ret turn bre 打印 二叉 添加 因為騰訊分分網站開發 haozbbs.com Q1446595067二叉排序樹的中序遍歷結果是遞增的,所以可以通過中序遍歷存儲結果,再判斷是否為遞增的數組。1) 對樹進行中序遍歷,將結果保存在b[]
資料結構作業:二叉排序樹及其相關操作
寫了一個簡單的。 因為自己對泛型瞭解的還是不夠到位,所以只能寫個demo版的。 這課樹沒辦法維持平衡,希望以後學一下紅黑樹,替罪羊樹etc. /* * 簡單的二叉查詢樹 * 沒有自帶旋轉平衡 * 寫完這個我學一下 * avl樹還有紅黑樹 */ public c
Android版數據結構與算法(八):二叉排序樹
delet 概念 最好 指定 性能 and 並且 二叉樹 排列 本文目錄 前兩篇文章我們學習了一些樹的基本概念以及常用操作,本篇我們了解一下二叉樹的一種特殊形式:二叉排序樹(Binary Sort Tree),又稱二叉查找樹(Binary Search Tree),亦稱二
資料結構實驗之查詢一:二叉排序樹 (SDUT 3373)
二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),也稱二叉搜尋樹。 #include <stdio.h> #include <string.h> #include <stdlib.h> struct nod
Java資料結構:二叉排序樹的刪除操作
嚶嚶嚶,今天補回昨天沒有寫的部落格。 二叉排序樹的刪除操作比較簡單,但是思想很全面,因此本人就寫一篇部落格紀念一下。 思想:四種類型也可以是三種 1,刪除結點p的度為2,即有左右子樹。 此時有兩種方法,第一種將結點的左子樹在中根遍歷下的最後一個結點放到p的位置。第二種是將p結點
SDUT3374資料結構實驗之查詢一:二叉排序樹
判斷是否為同一棵二叉排序樹 解決這個問題需要兩步: 1.建立二叉排序樹 2.判斷兩棵樹是否相同 詳情看程式碼和註釋,懶人程式碼 #include <iostream> #include <cstring> using namespace std; type
九度筆記之 1467:二叉排序樹
題目1467:二叉排序樹 時間限制:1 秒 記憶體限制:128 兆 特殊判題:否 提交:1292 解決:518 題目描述: 二叉排序樹,也稱為二叉查詢樹。可以是一顆空樹,也可以是一顆具有如下特性的非空二叉樹: 1
判斷一棵樹是否是二叉排序樹演算法的巧妙之處
運用全域性變數pre和中序遍歷的思想,儲存上一個結點的指標,然後將當前結點和上一個結點進行比較,從而作出判斷。 typedef struct { KeyType key; ... ..
重溫資料結構:二叉排序樹的查詢、插入、刪除
讀完本文你將瞭解到: 我們知道,二分查詢可以縮短查詢的時間,但是有個要求就是 查詢的資料必須是有序的。每次查詢、操作時都要維護一個有序的資料集,於是有了二叉排序樹這個概念。 上篇文章 我們介紹了 二叉樹 的概念,二叉樹有左右子樹之分,想必在區分左右子樹
構造二叉排序樹(BST)+二叉排序樹的刪除
主要是刪除操作 二叉排序樹的刪除 1. 刪除葉結點,直接刪除 2. 刪除結點p只有左子樹或右子樹,讓其子樹替代該結點p即可 3. 刪除結點p既有左子樹又有右子樹,以該結點p為根,查詢中序遍歷下第一個結點t,使這個結點t替換p結點(val覆蓋即可),再遞迴一次刪除這個結點t即
九度OJ題目1201:二叉排序樹
紀念一下終於在二叉樹上的程式碼準確率,但還是在給root分配空間的時候忘記要寫了 悲劇 還沒看到提示要考慮忽略重複元素,這個好解決 題目描述: 輸入一系列整數,建立二叉排序數,並進行前
九度 題目1467:二叉排序樹
程式碼設計: #include <iostream> #include <algorithm> #include <stdio.h> using namespace
題目1467:二叉排序樹 九度OJ
題目1467:二叉排序樹 時間限制:1 秒 記憶體限制:128 兆 特殊判題:否 提交:4745 解決:1953 題目描述: 二叉排序樹,也稱為二叉查詢樹。可以
C++ 判斷一顆樹是否是BST(二叉排序樹)
方法一:使用中序遍歷因為二叉排序樹的中序遍歷結果是遞增的,所以可以通過中序遍歷儲存結果,再判斷是否為遞增的陣列。1) 對樹進行中序遍歷,將結果儲存在b[]陣列中。2) 檢測b[]陣列中元素是否為升序排列。如果是,則這棵樹為BST.時間複雜度: O(n)程式碼如下:#inclu
演算法題(三十一):二叉搜尋樹(BST)的後序遍歷序列
題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 分析 後序遍歷序列中,最右邊數字也就是根結點,會把數集分為左右兩部分,左邊數集都小於root,右邊數集都大於root。左