二叉链表实现完全二叉树,采用三叉链表存储二叉树
NC332二叉树扩展为单链表
描述一棵有n个节点的二叉树。请将二叉树展开成一个链表。
1.展开的链表也是一个TreeNode,右边的指针指向下一个节点,左边的节点为空。
2.链表的顺序与给定二叉树的第一个遍历顺序相同。
3.这个问题不需要返回链表或者树。请在原树上操作,系统最后会检查原树的情况,以确定你的代码是否正确。
4.该问题有O(1)额外空间复杂度的解。你能意识到吗?传入的TreeNode不包括在空间复杂度的计算中。
例如:
最初的二叉树是
膨胀后是
数据范围:满足二叉树的节点数,满足二叉树的节点值。
示例1输入:
{1,2,3,4,8}副本
返回值:
{1,# 2,# 4,# 8,# 3 }副本
2示例输入:
{0}份副本
返回值:
{0}非递归实现的解决方案我们很容易想到用递归的方法先得到所有被遍历的节点,然后把这些节点串联起来。那么,在遍历的过程中,这些节点可以按照先遍历的顺序串联起来吗?答案是肯定的,我们可以使用顺序遍历的非递归实现。在栈的帮助下,先把后面的节点放入栈中,然后处理栈顶元素,这个元素的右节点和左节点按顺序放入栈中,直到栈空,退出循环。
代码如下:
#包含位/标准数据。h
定义树结构
{
int val
TreeNode * left
TreeNode * right
TreeNode() : val(0),left(nullptr),right(nullptr) {}
TreeNode(int x) : val(x),left(nullptr),right(nullptr) {}
TreeNode(int x,TreeNode *left,TreeNode *right) : val(x),left(左),right(右){}
};
类别解决方案
{
公共:
void expandTree(TreeNode *root)
{
if (root==nullptr)
{
返回;
}
TreeNode * node=nullptr
STD:stack TreeNode * s;
s.push(根);
而(!s.empty()
{
auto cur=s . top();
s . pop();
if (cur- right!=nullptr)
{
s.push(向右弯曲);
}
if (cur- left!=nullptr)
{
s.push(向左弯曲);
}
if (node==nullptr)
{
node=cur
node-left=node-right=nullptr;
}
其他
{
node-left=nullptr;
node-right=cur;
node=节点右;
}
}
}
};
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。