二叉樹的遍歷(前序、中序和後序),遞歸和非遞歸的實現。前序和中序實現基本類似,後序稍微複雜一點,需要判斷當前節點的右子樹是否爲空或者已經訪問過,代碼如下:
//前序遍歷:遞歸
void preorder(TreeNode *root, vector<int> &path)
{
if(root != NULL)
{
path.push_back(root->val);
preorder(root->left, path);
preorder(root->right, path);
}
}
//中序遍歷:遞歸
void inorder(TreeNode *root, vector<int> &path)
{
if(root != NULL)
{
inorder(root->left, path);
path.push_back(root->val);
inorder(root->right, path);
}
}
//後續遍歷:遞歸
void postorder(TreeNode *root, vector<int> &path)
{
if(root != NULL)
{
postorder(root->left, path);
postorder(root->right, path);
path.push_back(root->val);
}
}
//前序遍歷:非遞歸
void preorderTraversal(TreeNode *root, vector<int> &path)
{
stack<TreeNode *> s;
TreeNode *p = root;
while(p != NULL || !s.empty())
{
while(p != NULL)
{
path.push_back(p->val);
s.push(p);
p = p->left;
}
if(!s.empty())
{
p = s.top();
s.pop();
p = p->right;
}
}
}
//中序遍歷:非遞歸
void inorderTraversal(TreeNode *root, vector<int> &path)
{
stack<TreeNode *> s;
TreeNode *p = root;
while(p != NULL || !s.empty())
{
while(p != NULL)
{
s.push(p);
p = p->left;
}
if(!s.empty())
{
p = s.top();
path.push_back(p->val);
s.pop();
p = p->right;
}
}
}
//後序遍歷:非遞歸第一種
void postorderTraversal1(TreeNode *root, vector<int> &path)
{
stack<TempNode *> s;
TreeNode *p = root;
TempNode *temp;
while(p != NULL || !s.empty())
{
while(p != NULL) //沿左子樹一直往下搜索,直至出現沒有左子樹的結點
{
TempNode *tempNode = new TempNode;
tempNode->btnode = p;
tempNode->isFirst = true;
s.push(tempNode);
p = p->left;
}
if(!s.empty())
{
temp = s.top();
s.pop();
if(temp->isFirst == true) //表示是第一次出現在棧頂
{
temp->isFirst = false;
s.push(temp);
p = temp->btnode->right;
}
else //第二次出現在棧頂
{
path.push_back(temp->btnode->val);
p = NULL;
}
}
}
}
//後序遍歷:非遞歸第二種
void postorderTraversal2(TreeNode *root, vector<int> &path)
{
stack<TreeNode *> s;
TreeNode *curr = NULL;
TreeNode *last = NULL;
s.push(root);
while(!s.empty())
{
curr = s.top();
if((curr->lchild == NULL && curr->rchild == NULL) ||
(last != NULL && (last == curr->lchild || last == curr->rchild)))
{
path.push_back(curr->val);
s.pop();
last = curr;
}
else
{
if(curr->rchild != NULL)
s.push(curr->rchild);
if(curr->lchild != NULL)
s.push(curr->lchild);
}
}
}