标签:
对于二叉树的遍历,先序的方式是比较简单的,但是中序和后序的方式还是有点麻烦的,这里先给出一个用C++stack的遍历方式:
1.如果当前结点不为空 把当前结点压入栈 p=p->left转向其左孩子 2.如果当前结点为空(证明这半棵子树已经遍历完成,需要从栈顶找到树根) 取栈顶元素为当前结点,栈做一次弹栈操作 访问当前结点 p=p->right转向其右孩子 3.重复1、2操作,直到栈为空并且当前结点为NULL,结束。
算法代码实现:
vector<int> inOrder(TreeNode *root)
{
vector<int> result;
const TreeNode *cur;
stack<const TreeNode*> s;
cur = root;
while(!s.empty() || cur != NULL)
{
if(cur != NULL)
{
s.push(cur);
cur = cur->left;
}//if
else
{
cur = s.top();
s.pop();
result.push_back(cur->val);
cur = cur->right;
}
}//while
return result;
}
这种利用栈的遍历方法很简单,在之前我也设计了一个自己的遍历的方法:
1.如果当前结点为空(NULL) 取栈顶元素为当前结点,栈做一次弹栈操作 访问当前结点 p=p->right转向其右孩子 2.如果当前结点不为空 如果当前结点有左孩子 把当前结点压入栈 p=p->left转向其左孩子 如果当前结点没有左孩子 访问当前结点 p=p->right转向其右孩子 3.重复1、2操作,直到栈为空并且当前结点为NULL,结束。
代码实现:
vector<int> inOrder(TreeNode *root)
{
const TreeNode* cur;
stack<const TreeNode*> s;
vector<int> result;
cur = root;
while(!s.empty() || cur != NULL)
{
if(cur == NULL)
{
cur = s.top();
s.pop();
result.push_back(cur->val);
cur = cur->right;
}//if
else
{
if(cur->left != NULL)
{
s.push(cur);
cur = cur->left;
}
else
{
result.push_back(cur->val);
cur = cur->right;
}
}//else
}//while
return result;
}
标签:
原文地址:http://www.cnblogs.com/stemon/p/4675906.html