【LeetCode】初級演算法:樹
1. 二叉樹的最大深度
用時:0ms
class Solution {
public int maxDepth(TreeNode root) {
// 返回左右子樹深度的最大值,再加1
if(root!=null){
return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
}
return 0;
}
}
2. 驗證二叉搜尋樹
用時:3ms
class Solution {
public boolean isValidBST(TreeNode root) {
ArrayList<Integer> array=new ArrayList<>();
func(root,array);
for(int i=1;i<array.size();++i){
// 兩個元素相同時為false
if(array.get(i-1)>=array.get(i)){
return false;
}
}
return true;
}
// 中序遍歷後陣列為升序即為true
public void func(TreeNode root,ArrayList<Integer> array){
if(root!=null){
func(root.left,array);
array.add(root.val);
func(root.right,array);
}
}
}
3. 對稱二叉樹
用時:11ms
class Solution {
public boolean isSymmetric(TreeNode root) {
ArrayList<Integer> array=new ArrayList<>();
StringBuilder direcStr=new StringBuilder();
inOrder(root,array,direcStr,'1');
int i=0,j=direcStr.length()-1;
while(i<j){
// 如果方向相同,或者陣列不是迴文,則不是對稱
if(direcStr.charAt(i)==direcStr.charAt(j)||array.get(i)!=array.get(j)){
return false;
}
++i;
--j;
}
return true;
}
// 中序遍歷後陣列是迴文的,並且方向也是迴文的
public void inOrder(TreeNode root,ArrayList<Integer> array,StringBuilder direcStr,char direc){
if(root!=null){
inOrder(root.left,array,direcStr,'1');
array.add(root.val);
direcStr.append(direc);
inOrder(root.right,array,direcStr,'0');
}
}
}
4. 二叉樹的層次遍歷
用時:1ms
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> outList=new ArrayList<>();
inOrder(root,outList,0);
return outList;
}
// 先序遍歷的同時將每一層的結點儲存到對應層次的列表
public void inOrder(TreeNode root,List<List<Integer>> outList,int deepth){
if(root==null) return;
// 如果深度大於外列表長度,表示左邊沒有右邊深
while(outList.size()<=deepth){
outList.add(new ArrayList<Integer>());
}
outList.get(deepth).add(root.val);
inOrder(root.left,outList,deepth+1);
inOrder(root.right,outList,deepth+1);
}
}
5. 將有序陣列轉換為二叉搜尋樹
用時:1ms
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return convert(nums,0,nums.length-1);
}
// 每次都將子陣列的中間值作為子樹根節點
public TreeNode convert(int[] nums,int s,int e){
if(s>e) return null;
int center=(s+e+1)/2; // 根據示例,偶數陣列以右邊作為center
TreeNode curRoot=new TreeNode(nums[center]);
curRoot.left=convert(nums,s,center-1);
curRoot.right=convert(nums,center+1,e);
return curRoot;
}
}
相關文章
- 初級演算法-樹演算法
- [Golang]力扣Leetcode—初級演算法—樹—二叉樹的最大深度Golang力扣LeetCode演算法二叉樹
- 【LeetCode】初級演算法:字串LeetCode演算法字串
- 【Leetcode】初級演算法-數學LeetCode演算法
- 【LeetCode】初級演算法:陣列LeetCode演算法陣列
- 【LeetCode】初級演算法:連結串列LeetCode演算法
- 【LeetCode】初級演算法:排序和搜尋LeetCode演算法排序
- [leetcode初級演算法]動態規劃總結LeetCode演算法動態規劃
- 初級演算法演算法
- LeetCode初級-反轉字串LeetCode字串
- LeetCode初級演算法之字串:242 有效的字母異位詞LeetCode演算法字串
- 初級演算法-連結串列演算法
- 素數判定演算法 初級演算法
- Java 教學例子 目錄樹 (初級) (轉)Java
- 『演算法』之 初級排序演算法總結演算法排序
- leetcode演算法熱題--兩樹之和LeetCode演算法
- 初級演算法-動態規劃演算法動態規劃
- c++ LeetCode (初級字串篇) 九道演算法例題程式碼詳解(二)C++LeetCode字串演算法
- 初級~~初級~~~初初級~~~KanjiWeb 3.0 (漢字通)破解~~~~~~~~~ (8千字)Web
- LeetCode初級演算法之字串:387 字串中的第一個唯一字元LeetCode演算法字串字元
- 洛谷 P3919 可持久化線段樹 1 之主席樹模板(初級)持久化
- 【資料結構與演算法】二分鐘初識樹資料結構演算法
- 程式設計熊講解LeetCode演算法《二叉樹》程式設計LeetCode演算法二叉樹
- 初學者Mybatis的初級使用MyBatis
- LeetCode 刷題—樹LeetCode
- Leetcode-572: 另一個樹的子樹( leetcode100:相同的樹 )LeetCode
- ActiveMQ初級教程MQ
- Leetcode 演算法題解系列 - 二叉樹的層序遍歷LeetCode演算法二叉樹
- 無限級目錄樹最優演算法的新研究 (轉)演算法
- 演算法技能樹演算法
- 【演算法】字首樹演算法
- 生成樹演算法演算法
- LINUX初級命令Linux
- grafana初級入門Grafana
- LeetCode 100——相同的樹LeetCode
- 【演算法】KMP初識演算法KMP
- 演算法初體驗演算法
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹