我想要一个解决方案,在二叉树中以交替的左右方向遍历。级别顺序遍历为“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”
答案 0 :(得分: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;
}
}
}