輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
二叉樹前序遍歷第乙個點為根節點,中序遍歷順序為先左子樹然後根節點最後右子樹。所以先通過前序遍歷找出根節點,然後將中序遍歷分為左右子樹兩組,最後對於每個子樹依次遞迴呼叫。
/*以後這個就是樹的基本結構,最快做題*/
function treenode(x)
/*前序和中序重構二叉樹*/
function reconstructbinarytree1(pre,vin)
//中序+後序:中序遍歷序列和後序遍歷序列可以確定唯一的二叉樹
function reconstructbinarytree2(pos, vin)
/*前序遍歷*/
/*思路:首先寫函式,傳參,然後把結果放到陣列中,因為傳進來的其實就是根節點,首先判斷是否為空*/
/*非空的話把根節點的值放到陣列。因為是先序,所以先放,然後遞迴左子樹,右子樹*/
function preorder(tree)
};preorder(tree);
return result;
}/*中序遍歷*/
function vinorder(tree)
};vinorder(tree);
return result;
}/*後續遍歷*/
function postorder(tree)
};postorder(tree);
return result;
}/*測試*/
var pre=[11,7,5,3,9,8,10,13,12,14,20,18,25];
var vin=[3,5,7,8,9,10,11,12,13,14,18,20,25];
var post=[3,5,8,10,9,7,12,18,25,20,14,13,11];
tree1=reconstructbinarytree1(pre,vin);
tree2=reconstructbinarytree2(post,vin);
console.log(tree2);
console.log(preorder(tree2));
console.log(vinorder(tree2));
console.log(postorder(tree2));
注意點:
indexof()函式根據給定元素,判斷在陣列中的位置,如果陣列中沒有,那麼返回-1;
slice(n,m) 切分陣列n表示開始位置,m表示結束位置,並不包含m位置上的值。不改變原來陣列。
以下**是實現二叉搜尋樹的資料結構,可以參考
/*實現二叉樹的資料結構*/
//定義的構建二叉樹,前序,後序,中序,查詢最大,最小,特定沒有問題,刪除有小問題,小問題是刪除節點後的二叉樹不能呼叫前序等方法
/*刪除節點後的二叉樹,雖然可以中序等遍歷,但是遍歷的節點會有重複*/
//定義節點
class node
}//建立二叉搜尋樹bst
class binarysearchtree
// 插入節點
insert(data)
};inordernode(this.root,callback);
function callback(v)
return backs;
}// 前序遍歷
preorder()
};preordernode(this.root,callback);
function callback(v)
return backs;
}// 後序遍歷
postorder()
};postordernode(this.root,callback);
function callback(v)
return backs;
}// 查詢最小值
getmin(node);
return minnode(node || this.root)
}// 查詢最大值
getmax(node);
return maxnode(this.node || this.root)
}// 查詢特定值
find(data)
}else if (data < node.data) else
}return removenode(this.root, data);
}}//建立bst
const tree =new binarysearchtree();
tree.insert(11);
tree.insert(7);
tree.insert(5);
tree.insert(3);
tree.insert(9);
tree.insert(8);
tree.insert(10);
tree.insert(13);
tree.insert(12);
tree.insert(14);
tree.insert(20);
tree.insert(18);
tree.insert(25);
// // console.log(tree);
// // console.log(tree.root);
// console.log(tree.preorder());
// console.log(tree.inorder());
// console.log(tree.postorder());
// console.log(tree.getmin());
// console.log(tree.getmax());
// console.log(tree.find(2));
// console.log(tree.find(11));
// //刪除節點,返回新的二叉樹,不改變原來的二叉樹
// console.log('..........1.............')
// console.log(tree)
// // console.log(tree.remove(11));
// a=tree.remove(11);
// console.log('..........2.............');
// console.log(tree);
// console.log('.............3..........');
// console.log(tree.inorder());
// console.log(a);
// console.log('..........4.............')
// console.log(a.root);
// console.log('.......................')
// console.log(tree);
// console.log('.......................')
/*根據前序和中序構建二叉樹*/
function reconstructbinarytree(pre,vin) ;
}var pre=[11,7,5,3,9,8,10,13,12,14,18,20,25];
var vin=[3,5,7,8,9,10,11,12,13,14,18,20,25];
var result=reconstructbinarytree(pre,vin);
console.log(result);
劍指offer 04 單調矩陣
本題中的矩陣,每行每列都是單調遞增的,解法一 二分 這道題很容易讓人想到二分。二分如果要選左邊的元素,那麼需要用ceil函式來確定中間,這是乙個坑。然後二分的思路就是確定候選區間,先根據第乙個元素選出右區間,再根據最後乙個元素選出左區間,在區間內二分即可。from math import ceil ...
劍指offer04 二維陣列查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。測試示例 矩陣 matrix 如下 begin 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 ...
劍指Offer04 二維陣列中的查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個高效的函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,1...