1. 程式人生 > 其它 >【Leetcode 230】js 二叉搜尋樹的第k小的元素

【Leetcode 230】js 二叉搜尋樹的第k小的元素

技術標籤:資料結構與演算法資料結構二叉樹演算法leetcodejavascript

二叉搜尋樹的第k小的元素

題目

給定一棵二叉搜尋樹,請找出其中的第k小的結點。 例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。

示例 1:

輸入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
輸出: 1

思路

二叉搜尋樹的中序遍歷即排序後的節點,本題實際考察二叉樹的遍歷。

程式碼

遞迴實現

function KthNode(root, k) {
  const arr = [];
  orderTraversal
(root, arr) if (k > 0 && k <= arr.length) { return arr[k - 1]; } else { return null } } function orderTraversal(root, arr) { if (root) { orderTraversal(root.left, arr); arr.push(root); orderTraversal(root.right, arr); } }

image-20210119114752627

非遞迴實現

function KthNode(root, k)
{ const result = []; const stack = []; let current = root; while (current || stack.length > 0) { while (current) { stack.push(current); current = current.left; } current = stack.pop(); result.push(current); current = current.right; } if (k > 0 &&
k <= result.length) { return result[k - 1]; } else { return null; } }

image-20210119113401949

其實我們不需要獲取所有的result存起來,只要獲取第k個result就好了

function kNode(node, k) {
  //非遞迴.中序
  const stack = [];
  let current = node;
  let sum = 1;
  while (current || stack.length > 0) {
    while (current) {
      stack.push(current);
      current = current.left;
    }
    current = stack.pop();
    if (sum === k) {
      return current;
    } else {
      sum++;
    }
    current = current.right;
  }
}

image-20210119114324363

寫法優點缺點
遞迴寫法簡單明瞭效能太差,容易棧溢位
迴圈寫法效能強 ,理論上不會棧溢位不直觀

更多資料

整理不易,若對您有幫助,請給個「關注+點贊」,您的支援是我更新的動力