樹的大部分問題都可以通過遞迴解決,即求乙個樹的某個值可以轉化為求左子樹/右子樹的值
二叉樹最大深度就是max(左子樹的最大深度,右子樹的最大深度) + 1(根節點)
public
int maxdepth(treenode root)
intleft = maxdepth(root.left);
intright = maxdepth(root.right);
return left
< right ? right + 1: left+1;
}
二叉搜尋樹是自左向右的有序樹,可以通過中序遍歷,然後判斷中序遍歷的結果是否有序
public boolean isvalidbst(treenode root)
listvalues = new arraylist();
inorder(root, values);
for (int i = 0; i < values.size() - 1; i++)
}return
true;
}// 中序遍歷
public
void
inorder(treenode root, listvalues)
inorder(root.left, values);
values.add(root.val);
inorder(root.right, values);
}
對稱二叉樹就是判斷左右子樹對稱,遞迴方法即可
public boolean issymmetric(treenode root)
return isnodesymmetric(root.right, root.left);
}private boolean isnodesymmetric(treenode right, treenode left)
if (right == null || left == null)
boolean result = right.val == left.val && isnodesymmetric(right.right, left.left) &&
isnodesymmetric(right.left, left.right);
return result;
}
public
list
<
list
<
integer
>> levelorder(treenode root)
list
<
list
<
integer
>> result =
new arraylist<
list
<
integer
>>();
linkedlist
queue
=new linkedlist();
linkedlist nextqueue =
new linkedlist();
queue
.add(root);
list
<
integer
> level0 =
new arraylist<
integer
>();
level0.add(root.val);
result.add(level0);
if (root.left !=
null)
if (root.right !=
null)
while (!nextqueue.isempty())
if (node.right !=
null)
}if (!level.isempty())
}return result;
}
上面這個解法有問題,queue其實沒有用,還進行了佇列的深拷貝,空間複雜度高,並且花費的時間比較久,
if (root ==
null)
list
<
list
<
integer
>> result =
new arraylist<
list
<
integer
>>();
linkedlist
queue
=new linkedlist();
list
<
integer
> level0 =
new arraylist<
integer
>();
level0.add(root.val);
result.add(level0);
if (root.left !=
null)
if (root.right !=
null)
while (!
queue
.isempty())
if (node.right !=
null)
}if (!level.isempty())
}return result;
二叉搜尋樹本身就是有序的,所以將有序陣列轉換為二叉搜尋樹,就是按照左根右的順序構建樹,根節點就是中間的值,使用遞迴來解決
public treenode sortedarraytobst(int nums)
return generatesortedarray(nums, 0, nums.length -1);
}private treenode generatesortedarray(int nums , int start, int
end)
intmid = (start + end)/2;
treenode head = new treenode(nums[mid]);
head.left = generatesortedarray(nums, start, mid -1);
head.right = generatesortedarray(nums, mid+1,end);
return head;
}
初級演算法之樹 層次遍歷
二叉樹的層次遍歷 給定乙個二叉樹,返回其按層次遍歷的節點值。即逐層地,從左到右訪問所有節點 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 157返回其層次遍歷結果 3 9 20 15,7 挺簡單一題。自己寫的 複雜一點,都貼上去吧 vectorint levelorde...
線段樹初級
今天做到一題是線段樹題,在此補充一下我自己缺失的知識點 首先介紹乙個寫的賊好的部落格 準備每天看一篇,每天增加乙個小的知識點。今天是線段樹 首先是建樹的過程,因為鄙人畫圖技術有限,所以大家還是參考那個部落格的講解吧,這裡主要是一些 void buildtree int l,int r,int n i...
初級演算法之樹 驗證二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3輸出 true 示例 2 輸入 5 1 4 3 6輸出 false 解釋 輸入...