二叉樹是指任何節點最多只有兩個子節點;而二叉搜尋樹(也稱二叉查詢樹)的規則如下:
根據上面的定義,判斷下圖中的樹哪個不是二叉搜尋樹:
左邊的是,右邊的不是;因為根節點的鍵值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 解釋 輸入為 ...