劍指offer 04前序中序構建二叉樹

2021-09-11 02:12:23 字數 3848 閱讀 9022

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

二叉樹前序遍歷第乙個點為根節點,中序遍歷順序為先左子樹然後根節點最後右子樹。所以先通過前序遍歷找出根節點,然後將中序遍歷分為左右子樹兩組,最後對於每個子樹依次遞迴呼叫。

/*以後這個就是樹的基本結構,最快做題*/

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...