二叉树的遍历
二叉树是一种重要的数据结构。遍历方式有前序遍历、中序遍历、后续遍历以及层次遍历。对于前序、中序和后续遍历,采用递归的思想代码实现起来简单且容易理解,非递归实现需要用到辅助栈。层次遍历需要用到辅助队列来实现。
一、前序遍历
前序遍历是按照:根结点-左结点-有结点 顺序访问。
递归代码实现:
/*二叉树前序遍历递归实现*/
void preOrder(BinaryTreeNode* Root)
{
if (Root != NULL)
{
cout << Root->val << " ";
preOrder(Root->left);
preOrder(Root->right);
}
}
对于任一结点p:
(1)访问结点P,并将结点P入栈;
(2)判断结点P的左结点是否为空,若为空,则取栈顶元素并进行出栈操作,并将栈顶元素的右结点置为当前P,重复(1);若不为空,则将P的左结点置为当前P;
(3)直到P为NULL并且栈为空,则遍历结束。
代码实现:
/*二叉树前序遍历非递归实现1*/
void preOrder_1(BinaryTreeNode* Root)
{
if (Root == NULL)
return;
stack<BinaryTreeNode*> nodeStack;
nodeStack.push(Root);
while (!nodeStack.empty())
{
BinaryTreeNode* p = nodeStack.top();
nodeStack.pop();
cout << p->val << " ";
if (p->right != NULL)
nodeStack.push(p->right);
if (p->left != NULL)
nodeStack.push(p->left);
}
}
/*二叉树前序遍历非递归实现2*/
void preOrder_2(BinaryTreeNode* Root)
{
if (Root == NULL)
return;
stack<BinaryTreeNode*> nodeStack;
BinaryTreeNode* p = Root;
while (p != NULL || !nodeStack.empty())
{
while (p != NULL)
{
cout << p->val << " ";
nodeStack.push(p);
p = p->left;
}
if (!nodeStack.empty())
{
p = nodeStack.top();
nodeStack.pop();
p = p->right;
}
}
}
中序遍历是按照:左结点-根结点-右结点 顺序访问。
递归代码实现:
/*二叉树中序遍历递归实现*/
void inOrder(BinaryTreeNode* Root)
{
if (Root != NULL)
{
inOrder(Root->