標籤:ast node 一個 若是 return 遞迴 false 樹的子結構 鏡像樹
(1)
輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
思路:首先找到A中結點的值與B相等的結點,然後從這兩個相同的結點出發,判斷是否存在重合,若是返回true。否則,在樹A的左右子樹中尋找與B結點值相同的結點,以這些結點出發遞迴判斷是否是A的子樹。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function HasSubtree(pRoot1, pRoot2)
{
if(pRoot2 == null || pRoot1 == null ) {
return false;
}
var flag = false;
if(pRoot1.val == pRoot2.val) {
flag = subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
}
if(!flag) {
flag = HasSubtree(pRoot1.left, pRoot2) || HasSubtree(pRoot1.right, pRoot2);
}
return flag;
}
function subTree(pRoot1,pRoot2){ //判斷以root1和root2開頭的子數是否重合
if(pRoot2 == null) {
return true;
}
if(pRoot1 == null && pRoot2!=null) {
return false;
}
if(pRoot1.val == pRoot2.val){
return subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
}
return false;
}
(2)操作給定的二叉樹,將其變換為源二叉樹的鏡像。
二叉樹的鏡像定義:源二叉樹 8 / 6 10 / \ / 5 7 9 11 鏡像二叉樹 8 / 10 6 / \ / 11 9 7 5
思路:二叉樹的鏡像樹,通過可以看出,從根結點出發(先序遍曆思想),先交換根結點的孩子,再依次遞迴交換左子樹、右子數。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function Mirror(root)
{
if(root==null){
return;
}
var temp=root.right;
root.right=root.left;
root.left=temp;
Mirror(root.left);
Mirror(root.right);
return root;
}
(3)從上往下列印出二叉樹的每個節點,同層節點從左至右列印。
思路:二叉樹的層次遍曆,借用兩個數組即可。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function PrintFromTopToBottom(root)
{
var dequeTree=[]; //存放樹中的結點
var result=[]; //儲存結果
if(root==null){
return [];
}
dequeTree.push(root);
while(dequeTree.length){ //當dequeTree.length為0時,表明訪問完書中的結點
pNode=dequeTree.shift();
result.push(pNode.val);
if(pNode.left)
dequeTree.push(pNode.left);
if(pNode.right)
dequeTree.push(pNode.right);
}
return result;
}
(4)輸入一個整數數組,判斷該數組是不是某二叉搜尋樹的後序遍曆的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。
解析:對於一棵二叉排序樹,存在特點:根結點的左子樹都小於根結點,根結點的右子數都大於根結點。後序遍曆最後訪問的是根結點,因此,對於一個整數
數組,最後一個元素肯定是根結點,並且如果前部分(左子樹)都小於最後一個元素(根結點),後部分(右子樹)都大於最後一個元素(根結點)。遞迴判
斷前部分和後部分是否是二叉排序樹。
function VerifySquenceOfBST(sequence)
{
if(sequence.length==0){
return false;
}
return jurge(sequence,0,sequence.length-1);
function jurge(sequence,first,last){
if(first==last)
return true;
var max=sequence[last];
var temp1=first;
while(sequence[temp1]<max&&temp1<last){
temp1++;
}
temp1=temp1-1;
var temp2=temp1+1;
while(sequence[temp2]>max&&temp2<last){
temp2++;
}
if(temp2==last)
return true;
if(temp2!=last)
return false;
var a1=jurge(sequence,first,temp1);
var a2=jurge(sequence,temp1+1,last-1);
return a1&&a2;
}
}
劍指offer-js編寫-樹