두 갈래 나무의 세 가지 범람하는 귀속과 교체 해법
leetcode에는 세 가지 문제가 있는데 각각 세 가지 범람 결과를 구한다. 비나리 Tree Preorder Traversal, 비나리 Tree Inorder Traversal, 비나리 Tree Postorder Traversal이다.
귀속
귀속 해법은 더 이상 말할 필요가 없고 귀속 부분의 다른 위치에서 노드value를 수조에 설치하면 된다.
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
function dfs(root, ans) {
if (!root) return;
//
// ans.push(root.val);
dfs(root.left, ans);
//
// ans.push(root.val);
dfs(root.right, ans);
//
// ans.push(root.val);
}
var preorderTraversal = function(root) {
var ans = [];
dfs(root, ans);
return ans;
};
번갈아
어려운 점은 교체다.
만약에 두 갈래 나무를 그림으로 간주한다면 두 갈래 나무의 범람은 사실 그림의 깊이를 우선적으로 범람하는 것이다. 그림의 깊이를 우선적으로 범람하는 것은 수동 시뮬레이션 창고로 풀 수 있다면 두 갈래 나무의 범람도 가능하다.
창고 아날로그 그림의 깊이를 우선적으로 훑어보고 아버지 노드의 아들 노드 하나를 창고에 넣고 아들 노드를 삭제합니다
아버지 노드의 모든 아들 노드가 삭제되었을 때, 아버지 노드는 창고에서 나왔다
우리는 아래의 두 갈래 나무로 예를 들자.
1
/ \
2 5
/ \
3 4
어떻게 창고로 이 두 갈래 나무를 두루 훑어보는 것을 시뮬레이션합니까?우리는
stack
수 그룹 아날로그 창고를 사용한다.stack = [1]
stack = [1, 2]
2
로 하위 노드를 훑어보기 시작합니다.왼쪽 서브노드3
로 입고됩니다.stack = [1, 2, 3]
3
이고 하위 노드가 없어서 창고에서 꺼냅니다.stack = [1, 2]
2
로 그의 하위 노드를 두루 돌아다닌다.왼쪽 노드가 이미 두루 다니기 때문에 오른쪽 노드는 창고에 들어간다.stack = [1, 2, 4]
4
이고 3
와 마찬가지로 좌우 노드가 없어서 창고에서 나온다.stack = [1, 2]
2
이고 아버지 노드의 모든 아들 노드가 삭제될 때 아버지 노드가 창고에서 나가고 아버지 노드가 창고에서 나온다.stack = [1]
1
이고 그의 왼쪽 노드는 이미 옮겨다니고 오른쪽 노드를 옮겨다니며 5
를 창고에 넣는다.stack = [1, 5]
5
이고 하위 노드가 없어서 창고에서 나온다.stack = [1]
1
이고 그의 하위 노드는 모두 옮겨다니며 창고에서 나온다.stack=[]
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function(root) {
if (!root) return [];
var stack = [] //
, ans = [];
stack.push(root);
ans.push(root.val);
while (stack.length) {
var elem = stack[stack.length - 1];
if (elem.left) {
ans.push(elem.left.val);
stack.push(elem.left);
elem.left = null;
} else if (elem.right) {
ans.push(elem.right.val);
stack.push(elem.right);
elem.right = null;
} else
stack.pop();
}
return ans;
};
두 갈래 나무의 부 노드가 가장 많으면 두 개의 자 노드가 있기 때문에 두 개의 노드를 직접 훑어보고 창고에서 부 노드를 삭제하면 된다.
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function(root) {
if (!root) return [];
var stack = [] //
, ans = [];
stack.push(root);
while (stack.length) {
var elem = stack.pop();
ans.push(elem.val);
if (elem.right)
stack.push(elem.right);
if (elem.left)
stack.push(elem.left);
}
return ans;
};
var postorderTraversal = function(root) {
if (!root) return [];
var stack = [] //
, ans = [];
stack.push(root);
while (stack.length) {
var elem = stack[stack.length - 1];
if (elem.left) {
stack.push(elem.left);
elem.left = null;
} else if (elem.right) {
stack.push(elem.right);
elem.right = null;
} else {
var a = stack.pop();
ans.push(a.val);
}
}
return ans;
};
leetcode에서 중순으로 이 문제를 훑어보는 것은 선순과 후순보다 tag-hashtable가 하나 더 많은데 어떻게hash를 하는지도 바로 이 문제의 난점이다.중순 스트리밍은 부모 노드의 왼쪽 트리가 스트리밍된 후에 부모 노드의value 값을 ans 그룹에 저장합니다. 그러면 왼쪽 트리가 스트리밍이 끝난 것을 어떻게 판단합니까?
예를 들어 아래의 두 갈래 나무:
1
/ \
2 5
/ \
3 4
2
이 노드를 훑어보았을 때 왼쪽 노드가 있다. 선순과 후순으로 훑어보는 방법에 따라 왼쪽 노드를 창고에 넣고 2
가 있는 노드의left를null로 설정하고 노드3
가 창고에 나온 후에 2
노드의 좌우 서브 노드를 판단한다. 이때 왼쪽 노드가null인 것을 발견하면 이미 훑어봤다는 뜻이다. 그래서 value=2
ans수조에 저장한 다음에 4
가 있는 노드를 창고에 넣는다.그리고 4
다시 창고에 나가면 창고 꼭대기 원소가 2이고 이때 다시 좌우 노드를 판단한다. 왼쪽 노드가null인 것을 발견하고 왼쪽 노드가 두루 돌아다녔다고 생각하면 value=2
ans 그룹에 다시 저장한다!여기를 보면 당신은 약간의 갈피를 잡을 수 있습니다. 우리는null로 노드가 옮겨갔다는 것을 나타낼 수 없고 정확한hash 방식을 사용해야 합니다. 여기는 elem.left=1
elem의 왼쪽 노드가 옮겨갔다는 것을 나타냅니다. elem.left=0
elem 노드가 있는 값이 ans수 그룹에 저장되었다는 것을 나타냅니다.var inorderTraversal = function(root) {
if (!root) return [];
var stack = [], ans = [];
stack.push(root);
while (stack.length) {
var elem = stack[stack.length - 1];
if (elem.left === 1) {
elem.left = 0;
ans.push(elem.val);
} else if (elem.left) {
stack.push(elem.left);
elem.left = 1;
} else if (elem.left === null) {
elem.left = 1;
} else if (elem.right) {
stack.push(elem.right);
elem.right = null;
} else {
stack.pop();
}
}
return ans;
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.