LeetCode Binary Tree Preorder Traversal 앞의 두 갈래 트리 귀속과 비귀속 해법 반복
Given a binary tree, return the preorder traversal of its nodes' values.
For example: Given binary tree
{1,#,2,3}
, 1
\
2
/
3
return
[1,2,3]
. Note: Recursive solution is trivial, could you do it iteratively?
2014-1-10 update:
순서대로 반복하는 비귀속도 매우 간단하다.
vector<int> preorderTraversal(TreeNode *root)
{
vector<int> rs;
if (!root) return rs;
stack<TreeNode *> stk;
stk.push(root);
while (!stk.empty())
{
TreeNode *t = stk.top();
stk.pop();
rs.push_back(t->val);
if (t->right) stk.push(t->right);
if (t->left) stk.push(t->left);
}
return rs;
}
확실히 노트에서 말한 바와 같이 귀속을 사용하는 데는 몇 분만 걸리면 해결된다. 귀속을 사용하지 않으면 스스로 궁리하는 데 30분이 채 걸리지 않는다.
코드를 보면 비귀속이 귀속보다 훨씬 길다는 것을 알 수 있다.
비귀속 방법의 주요 난점:
1. 두 개의 순환을 사용해야 한다. 왼쪽 트리 순환은 오른쪽 트리 순환을 끼워 넣는다.
2. 오른쪽 나무가 있을 때 이 순환에서 벗어나 다시 왼쪽 나무 순환으로 들어가야 한다.
2. 왼쪽 나무가 없을 때는 빈 나무가 나올 때까지 기다리지 않고 창고를 나가야 한다.
다음은 두 가지 방법으로 이 문제를 해결해 보겠습니다. 그들의 시간 효율은 모두 많지 않습니다. 모두 12ms입니다. 대략 테스트 데이터가 매우 적기 때문에 시간은 모두 같습니다.Leet Code의 한 문제이기도 해요. 테스트 데이터가 많지 않아요.
기본 함수는 동일합니다.
vector<int> preorderTraversal(TreeNode *root) {
vector<int> prePath;
preStack(root, prePath);
return prePath;
}
귀속법:
void preNodes(TreeNode *node,vector<int> &onePath)
{
if(node == nullptr) return;
onePath.push_back(node->val);
preNodes(node->left, onePath);
preNodes(node->right, onePath);
}
비귀속법:
void preStack(TreeNode *node, vector<int> &prePath)
{
if(node == nullptr) return;
stack<TreeNode *> stk;
TreeNode *cur = node;
stk.push(cur);
while (!stk.empty())
{
cur = stk.top();
prePath.push_back(cur->val);
while (cur->left)
{
prePath.push_back(cur->left->val);
cur = cur->left;
stk.push(cur);
}
stk.pop();
while (!stk.empty() || cur->right)
{
if(cur->right)
{
cur = cur->right;
stk.push(cur);
break;
}
else
{
cur = stk.top();
stk.pop();
}
}//while
}//while
}
//2014-2-19 update
vector<int> preorderTraversal(TreeNode *root)
{
vector<int> rs;
if (!root) return rs;
stack<TreeNode *> stk;
stk.push(root);
while (!stk.empty())
{
TreeNode *t = stk.top();
stk.pop();
rs.push_back(t->val);
if (t->right) stk.push(t->right);
if (t->left) stk.push(t->left);
}
return rs;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.