二叉搜尋樹

2022-08-05 17:48:17 字數 3001 閱讀 6670

二叉搜尋樹的簡介:

o(log(n)),在最壞的情況下,二叉搜尋樹會退化為一個連結串列。為了解決這個問題呢,人們又提出了平衡搜尋樹;

二叉搜尋樹的性質:

1. 每個節點都有一個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不相同。

2. 左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。

3. 右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。

4. 左右子樹都是二叉搜尋樹。

如圖:

/*節點結構*/

template

struct

node

k key;

node

*left;

node

*right;

};

/*平衡搜尋樹類*/

template

class

searchbinarytree

bool creat(node*&root, k key); //遞迴建立

bool creat_nor(node*&root, k key); //非遞迴建立

bool delete(node*root, k key); //刪除某一節點

node

* find(node*root, k key); //查詢某一節點

node

* find_nor(node*root, k key); //非遞迴查詢某一節點

void inorder(node*root); //中序遍歷

public

: node

*_root;

};

/*相關函式的實現*/

template

bool searchbinarytree::creat(node*&root,k key)

if (key > root->key)

return creat(root->right, key);

else

if (key < root->key)

return creat(root->left, key);

else

return

false

;

}template

bool searchbinarytree::creat_nor(node*&root, k key)

node

* prev =null;

node

* cur =root;

while

(cur)

else

if (key < cur->key)

else

return

false

; }

if (prev->key

else

return

true;}

template

bool searchbinarytree::delete(node*root, k key)

node

* prev =null;

while

(root)

else

if (key < root->key)

else

//找的了相應的節點需要刪除了

else

if (root->key > prev->key)

else

delete

root;

}else

if (root->right == null) //

右為空

else

if (root->key > prev->key)

else

} else

//兩邊都不為空

node

* tmp = root->right;

prev = root; //

root 的右子樹的最左節點就是 root->right,保證prev始終是tmp的父親節點

while (tmp->left)

swap(tmp->key, root->key);

prev == root ? prev->right = tmp->right : prev->left = tmp->right;

}return

true

; }

}return

false;}

當左孩子,右孩子都不為空時,為什麼要將右子樹的最左孩子與root交換呢,原因是:交換之後能夠保證 root->left->key < root->key && root->right->key > root->key  

從而使得這個搜尋二叉樹依然有序

template

node

* searchbinarytree::find(node*root, k key)

if (key > root->key)

else

if (key < root->key)

else

}template

node

* searchbinarytree::find_nor(node*root, k key)

while

(root)

return

null;

}template

void searchbinarytree::inorder(node*root)

inorder(root->left);

cout

<< root->key << "";

inorder(root->right);

}

二叉樹 滿二叉樹與完全二叉樹

二叉樹 binary tree 是n n 0 個元素的有限集合,該集合為空或者為由一個稱為 根 的元素及兩個不相交的 被分別稱為左子樹和右子樹的二叉樹組成 二叉樹的基本特點 每個結點最多有兩棵子樹 左子樹和右子樹是有順序的,且不可顛倒 圖一1 結點 二叉樹中的每一個元素都稱為結點。通常二叉樹的許多名...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外一個結點的結點被稱之為孩子 child 雙親相應地,另外一個結點...

二叉樹 判斷二叉樹是否為完全二叉樹

問題描述 判斷一棵二叉樹是否為完全二叉樹。 知識點 完全二叉樹是指除二叉樹的最後一層外,其他各層的節點數達到最大個數,且最後一層的葉節點從左到右連續存在,只缺右側若干節點。 演算法實現 class node is complete binary tree public static boolean i...