5 1 1 二叉搜尋樹

2021-08-04 07:32:16 字數 1322 閱讀 6914

二叉樹是指任何節點最多只有兩個子節點;而二叉搜尋樹(也稱二叉查詢樹)的規則如下:

根據上面的定義,判斷下圖中的樹哪個不是二叉搜尋樹:

左邊的是,右邊的不是;因為根節點的鍵值6小於左子樹中其中乙個節點的鍵值7。請記住:從根節點一直往左(右)走,直到無左(右)路可走,即得最小(大)元素。如下圖所示:

二叉搜尋樹的常用操作有:查詢最小/大元素,插入及刪除元素。下面給出具體的操作步驟。注意:這裡以int型資料作為研究物件,當然可以寫成模板,這裡一切從簡,以聚焦於演算法的原理。樹中存放節點資料的結構體如下:

struct node

;

每個節點的資料結構包含乙個int型鍵值,兩個分別指向左、右子節點的節點指標,當不存在左(或右)子節點時,left(或right)為null。

要在一顆二叉搜尋樹中查詢最大值或最小值,一直往右或往左走即可。這裡只給出查詢最小節點的程式,查詢最大節點類似,下面**中的left換成right即可;注意邊界條件的判斷也相當重要,尤其在面試時,不可忘記!!!

// 遞迴實現

node* findmin(node* t)

// 非遞迴實現

node* findmin(node* t)

return t;

}

這裡找到了最小的節點(node* node),那麼結構體中的資料輕而易得(node->key)!

插入新元素到二叉搜尋樹中的規則很簡單:從根節點開始,遇到鍵值大的(即新元素的值《節點的鍵值)往左走,遇到鍵值小的往右走。

// 遞迴實現

node* insert(node* t, int x)

else

}if(x < t->key) // 向左走

insert(t->left, x);

else if(x > t->key) // 向右走

insert(t->right, x);

return t;

}// 非遞迴實現

node* insert(node* t, int x)

else

}while(x != t->key)

}return t;

}

圖5-6是二叉搜尋樹的元素移除操作**。欲刪除舊節點a,有兩種情況:

程式如下:

// 《資料結構和演算法分析——c語言描述》,該方法永遠返回根節點

node* delete(node* t, int x)

else}}

return t;

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 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 解釋 輸入為 ...