mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Merge pull request #1096 from xiaofei-2020/tree19
添加(0106.从中序与后序遍历序列构造二叉树.md):增加typescript版本
This commit is contained in:
@ -814,7 +814,114 @@ var buildTree = function(preorder, inorder) {
|
||||
};
|
||||
```
|
||||
|
||||
## TypeScript
|
||||
|
||||
> 106.从中序与后序遍历序列构造二叉树
|
||||
|
||||
**创建新数组:**
|
||||
|
||||
```typescript
|
||||
function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
|
||||
if (postorder.length === 0) return null;
|
||||
const rootVal: number = postorder.pop()!;
|
||||
const rootValIndex: number = inorder.indexOf(rootVal);
|
||||
const rootNode: TreeNode = new TreeNode(rootVal);
|
||||
rootNode.left = buildTree(inorder.slice(0, rootValIndex), postorder.slice(0, rootValIndex));
|
||||
rootNode.right = buildTree(inorder.slice(rootValIndex + 1), postorder.slice(rootValIndex));
|
||||
return rootNode;
|
||||
};
|
||||
```
|
||||
|
||||
**使用数组索引:**
|
||||
|
||||
```typescript
|
||||
function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
|
||||
function recur(
|
||||
inorder: number[], postorder: number[],
|
||||
inBegin: number, inEnd: number,
|
||||
postBegin: number, postEnd: number
|
||||
): TreeNode | null {
|
||||
if (postBegin === postEnd) return null;
|
||||
const rootVal: number = postorder[postEnd - 1]!;
|
||||
const rootValIndex: number = inorder.indexOf(rootVal, inBegin);
|
||||
const rootNode: TreeNode = new TreeNode(rootVal);
|
||||
|
||||
const leftInorderBegin: number = inBegin;
|
||||
const leftInorderEnd: number = rootValIndex;
|
||||
const rightInorderBegin: number = rootValIndex + 1;
|
||||
const rightInorderEnd: number = inEnd;
|
||||
|
||||
const leftPostorderBegin: number = postBegin;
|
||||
const leftPostorderEnd: number = postBegin + rootValIndex - inBegin;
|
||||
const rightPostorderBegin: number = leftPostorderEnd;
|
||||
const rightPostorderEnd: number = postEnd - 1;
|
||||
|
||||
rootNode.left = recur(
|
||||
inorder, postorder,
|
||||
leftInorderBegin, leftInorderEnd,
|
||||
leftPostorderBegin, leftPostorderEnd
|
||||
);
|
||||
rootNode.right = recur(
|
||||
inorder, postorder,
|
||||
rightInorderBegin, rightInorderEnd,
|
||||
rightPostorderBegin, rightPostorderEnd
|
||||
);
|
||||
return rootNode;
|
||||
}
|
||||
return recur(inorder, postorder, 0, inorder.length, 0, inorder.length);
|
||||
};
|
||||
```
|
||||
|
||||
> 105.从前序与中序遍历序列构造二叉树
|
||||
|
||||
**新建数组:**
|
||||
|
||||
```typescript
|
||||
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
|
||||
if (preorder.length === 0) return null;
|
||||
const rootVal: number = preorder[0];
|
||||
const rootNode: TreeNode = new TreeNode(rootVal);
|
||||
const rootValIndex: number = inorder.indexOf(rootVal);
|
||||
rootNode.left = buildTree(preorder.slice(1, rootValIndex + 1), inorder.slice(0, rootValIndex));
|
||||
rootNode.right = buildTree(preorder.slice(rootValIndex + 1), inorder.slice(rootValIndex + 1));
|
||||
return rootNode;
|
||||
};
|
||||
```
|
||||
|
||||
**使用数组索引:**
|
||||
|
||||
```typescript
|
||||
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
|
||||
function recur(
|
||||
preorder: number[], inorder: number[],
|
||||
preBegin: number, preEnd: number,
|
||||
inBegin: number, inEnd: number
|
||||
): TreeNode | null {
|
||||
if (preBegin === preEnd) return null;
|
||||
const rootVal: number = preorder[preBegin];
|
||||
const rootNode: TreeNode = new TreeNode(rootVal);
|
||||
const rootValIndex: number = inorder.indexOf(rootVal, inBegin);
|
||||
|
||||
const leftPreBegin: number = preBegin + 1;
|
||||
const leftPreEnd: number = preBegin + rootValIndex - inBegin + 1;
|
||||
const leftInBegin: number = inBegin;
|
||||
const leftInEnd: number = rootValIndex;
|
||||
|
||||
const rightPreBegin: number = leftPreEnd;
|
||||
const rightPreEnd: number = preEnd;
|
||||
const rightInBegin: number = rootValIndex + 1;
|
||||
const rightInEnd: number = inEnd;
|
||||
|
||||
rootNode.left = recur(preorder, inorder, leftPreBegin, leftPreEnd, leftInBegin, leftInEnd);
|
||||
rootNode.right = recur(preorder, inorder, rightPreBegin, rightPreEnd, rightInBegin, rightInEnd);
|
||||
return rootNode;
|
||||
};
|
||||
return recur(preorder, inorder, 0, preorder.length, 0, inorder.length);
|
||||
};
|
||||
```
|
||||
|
||||
## C
|
||||
|
||||
106 从中序与后序遍历序列构造二叉树
|
||||
|
||||
```c
|
||||
|
Reference in New Issue
Block a user