二叉搜尋樹

2021-07-23 19:37:56 字數 1829 閱讀 9444

二叉搜尋樹的性質:

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

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

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

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

5.中序遍歷的結果是有序的。

定義乙個節點:

templatestruct bstreenode

bstreenode* _left;

bstreenode* _right;

t _key;

};

構樹插入節點遞迴演算法:

bool insertr(const t& key)

bool _insertr(node*& root,const t& key)

if(root->_key>key)

else if(root->_key _right ,key);

} else //這個數存在root->_key==key

}

非遞迴:

bool insert(const t& key)

node* cur=_root;

node* prev=cur;

while(cur)

else if(cur->_key _right ;

}else //if(cur->_key ==key)

return false; //存在

} //不存在

if(prev->_key >key)

else

return true;

}

我在這裡分析一下刪除乙個節點的思路:

(1).當刪5這個節點時,直接刪除就可以。

(2).當刪9這個節點時,9這個節點的特點是左指標為空,只需要讓11這個節點指向10就可以。

(3).當刪11這個節點時,11這個節點的特點是右指標為空,只需要讓6這個節點指向10就可以。

(4).當刪6這個節點時,找右子樹的最左節點或左子樹的最右節點,然後值交換,再刪除找到的節點,這樣它同樣滿足二叉搜尋樹的性質。

非遞迴:

bool remove(const t& key)

else if(cur->_key >key)

else //找到key,再刪除

else

}else if(cur->_right ==null) //右為空

else

}else //刪除的節點左右都不為空

if(rightree->_right ==null)

else

}return true;

}} return false;

}

查詢比較簡單我只實現了非遞迴的:

bool find(const t& key)

else if(cur->_key >key)

else if(cur->_key ==key)

return true;

} return false;

}

中序遍歷它得到是有序的,我只實現了遞迴的,非遞迴的思想我在前面的部落格中有實現二叉樹的非遞迴遍歷思想是一樣的:

void inorderr()

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...