두 갈래 나무의 앞 순서 중 순서 뒤 순서 반복 총결산
기본적인 사고방식은 세 가지가 있는데 첫 번째는trivial의 귀속이고 두 번째는stack, 세 번째는Morris이다.
1. Discuss 영역의 요약:
https://leetcode.com/discuss/71943/preorder-inorder-and-postorder-iteratively-summarization
3) postorder
public List postorderTraversal(TreeNode root) {
LinkedList result = new LinkedList<>();
Deque stack = new ArrayDeque<>();
TreeNode p = root;
while(!stack.isEmpty() || p != null) {
if(p != null) {
stack.push(p);
result.addFirst(p.val); // Reverse the process of preorder
p = p.right; // Reverse the process of preorder
} else {
TreeNode node = stack.pop();
p = node.left; // Reverse the process of preorder
}
}
return result;
}
이postorder는 교묘한 방법을 사용했는데 아래와 같은 뒷순서가 반복되는 것만 못하다. 이것은 매우 편안하다.
//
void BT_PostOrderNoRec(pBintree root)
{
stack s;
pBintree pre = NULL;
pBintree top = NULL;
while((root != NULL) || (!s.empty()))
{
if(root != NULL)
{
s.push(root);
root = root->left;
}
else
{
top = s.top();
if(top->right != NULL && top->right != pre)
root = top->right;
else
{
visit(top);
pre = top;
s.pop();
}
}
}
}
2.lastpop 방법https://leetcode.com/discuss/9736/accepted-code-with-explaination-does-anyone-have-better-idea
3. prev 기록 방법 - 9장 알고리즘의postorder 방법:
//Iterative
public ArrayList postorderTraversal(TreeNode root) {
ArrayList result = new ArrayList();
Stack stack = new Stack();
TreeNode prev = null; // previously traversed node
TreeNode curr = root;
if (root == null) {
return result;
}
stack.push(root);
while (!stack.empty()) {
curr = stack.peek();
if (prev == null || prev.left == curr || prev.right == curr) { // traverse down the tree
if (curr.left != null) {
stack.push(curr.left);
} else if (curr.right != null) {
stack.push(curr.right);
}
} else if (curr.left == prev) { // traverse up the tree from the left
if (curr.right != null) {
stack.push(curr.right);
}
} else { // traverse up the tree from the right
result.add(curr.val);
stack.pop();
}
prev = curr;
}
return result;
}
4. 두 개의 창고로 뒷순서를 반복하는 방법: 두 개의 창고 stk, stk2를 설정한다.뿌리 결점을 첫 번째 창고 stk에 눌러넣기;stk 창고 꼭대기의 결점을 팝업하고 이 결점을 두 번째 창고 stk2에 눌러 넣기;현재 결점한 왼쪽 아이와 오른쪽 아이를 차례로 각각 stk에 입하;모든 요소가 stk2에 눌린 후 stk2의 창고 꼭대기 결점을 차례로 팝업하고 방문합니다.첫 번째 창고의 입잔 순서는 뿌리 결점, 왼쪽 아이와 오른쪽 아이이다.그래서 두 번째 창고에 눌러 넣는 순서는 뿌리 결점, 오른쪽 아이와 왼쪽 아이이다.따라서 튀어나오는 순서는 왼쪽 아이, 오른쪽 아이와 뿌리 결점이다.
void postOrder2(TreeNode *root) {
if(root == NULL)
return;
stack stk, stk2;
stk.push(root);
while(!stk.empty()) {
TreeNode *pNode = stk.top();
stk.pop();
stk2.push(pNode);
if(pNode->left != NULL)
stk.push(pNode->left);
if(pNode->right != NULL)
stk.push(pNode->right);
}
while(!stk2.empty()) {
cout << stk2.top()->val << endl;
stk2.pop();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.