如何在左右方向遍历二叉树?

时间:2015-07-03 19:35:36

标签: java data-structures binary-tree

我想要一个解决方案,在二叉树中以交替的左右方向遍历。级别顺序遍历为“1 2 3 4 5 6 7”。根据所需条件,我的输出必须为“1 2 3 7 6 5 4”。以下是我编写的代码。这是不对的。

com.myproject.widgetset.extendedComponents.client

输出结果是“1 2 3 5 4 6 7”

3 个答案:

答案 0 :(得分:3)

我从您的问题中了解到您希望以螺旋顺序打印树。

你可以简单地使用两个堆栈

  1. 从左到右打印的第一个堆栈。
  2. 从右到左打印的第二个堆栈。
  3. 从根节点开始,您必须将子节点存储在一个堆栈中。 因此,对于每个迭代,打印节点存在于一个堆栈中。下一级别被推入另一个堆栈。

答案 1 :(得分:2)

我会为您追踪您的实施情况。首先,您的队列包含节点1。

1

然后将其子项插入队列,首先将其中的子项插入队列,因为c为0。

1 2 3

1然后退出队列,因此你

离开了

2 3

由于你现在想要从右边开始,3将是理想的起点。但是,2在你的队列中排在第一位,所以它的孩子将被推到第一位。

2 3 5 4,然后2个出口形成3 5 4

此时3将把孩子推入队列,左边是因为c是0。

3 5 4 6 7

我认为你想要做的是拥有一个队列和一个堆栈,其中队列包含要打印的项目,堆栈接收从队列中删除的项目。然后,您可以弹出堆栈中的每个项目并将其子项推入队列。

例如,我们从队列中的1和空堆栈开始。然后我们从队列中删除1,打印它,然后将其推入堆栈。然后我们弹出1并将其子节点插入队列左前方。

2 3

接下来,我们打印2并将其放入堆栈中。对于3.现在我们的堆栈包含

2 3

然后我们从堆栈中弹出3并且这次将其子项排在右边。然后我们弹出2并为它的孩子做同样的事情。我们的队列现在包含

7 6 5 4

然后重复这个过程,直到你已经到达所有的叶子。

另外,一个提示:c可以是布尔值而不是数字,因为您只使用0和1作为值。它以这种方式节省空间。 :)

答案 2 :(得分:1)

以下方法在C ++中使用STL

struct TreeNode // basic Tree Structure
{
int data;
TreeNode* leftchild;
TreeNode* rightchild;
}
void alternateLeftRight(TreeNode*root)
{
Stack<TreeNode*>currentLevel; // take two stacks 
Stack<TreeNode*>nextLevel;
currentLevel.push(root);
int LeftToRight=0;  // LeftToRight mean we will approach leftchild before rightchild, if LeftToRight=0 , in this case we will approach rightchild first
while(!currentLevel.empty())
{ 

 TreeNode*temp=currentLevel.top();
 cout<<temp->data<<" ";
 currentLevel.pop();
if(LeftToRight)
{
 if(temp->leftchild)nextLevel.push(leftchild);
 if(temp->rightchild)nextLevel.push(rightchild);
}
else
{
  if(temp->leftchild)nextLevel.push(rightchild);
  if(temp->rightchild)nextLevel.push(leftchild);
}

if(currentLevel.empty())
{
swap(currentLevel,nextLevel);
LeftToRight=1-LeftToRight;
}

}

}