給定乙個二叉搜尋樹,編寫乙個函式 kthsmallest 來查詢其中第 k 個最小的元素。
說明:你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜尋樹元素個數。
示例 1:
輸入: root = [3,1,4,null,2], k = 13/
1 42
輸出: 1
示例 2:
輸入: root = [5,3,6,2,4,null,null,1], k = 35/
3 6/
2 4/
1輸出: 3
高階:如果二叉搜尋樹經常被修改(插入/刪除操作)並且你需要頻繁地查詢第 k 小的值,你將如何優化 kthsmallest 函式?
原理:二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
二叉排序樹的查詢過程和次優二叉樹類似,通常採取二叉鍊錶作為二叉排序樹的儲存結構。中序遍歷二叉排序樹可得到乙個關鍵字的有序序列,乙個無序序列可以通過構造一棵二叉排序樹變成乙個有序序列,構造樹的過程即為對無序序列進行排序的過程。每次插入的新的結點都是二叉排序樹上新的葉子結點,在進行插入操作時,不必移動其它結點,只需改動某個結點的指標,由空變為非空即可。搜尋,插入,刪除的複雜度等於樹高,o(log(n))
/**
* definition for a binary tree node.
* public class treenode
* }*/public class solution
public void ergodic(treenode node)
}
/**
* definition for a binary tree node.
* public class treenode
* }*/public class solution
public void ergodic(treenode node )
}
前中後序遍歷
//二分搜尋樹的前序遍歷(前序遍歷:根結點 ---> 左子樹 ---> 右子樹)
public void preorder()
//前序遍歷以node為根的二分搜尋樹,遞迴演算法
private void preorder(node node)
system.out.println(node.e);
preorder(node.left);
preorder(node.right);
}//二分搜尋樹的中序遍歷(中序遍歷:左子樹---> 根結點 ---> 右子樹)
public void inorder()
//中序遍歷以node為根的二分搜尋樹,遞迴演算法
private void inorder(node node)
inorder(node.left);
system.out.println(node.e);
inorder(node.right);
}//二分搜尋樹的後序遍歷(後序遍歷:左子樹 ---> 右子樹 ---> 根結點)
public void postorder()
//後序遍歷以node為根的二分搜尋樹,遞迴演算法
private void postorder(node node)
postorder(node.left);
postorder(node.right);
system.out.println(node.e);
}//層次遍歷--(基於佇列實現)
public void levelorder()
if (cur.right!=null)
}}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 ...
二叉搜尋樹結點最小距離
給定乙個二叉搜尋樹的根結點 root,返回樹中任意兩節點的差的最小值。示例 輸入 root 4,2,6,1,3,null,null 輸出 1 解釋 注意,root是樹結點物件 treenode object 而不是陣列。給定的樹 4,2,6,1,3,null,null 可表示為下圖 4 2 6 1 ...