一、题目描述
给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
示例 :
1 | 输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] |
提示:
- 给定树中的结点数介于 1 和 100 之间。
- 每个结点都有一个从 0 到 1000 范围内的唯一整数值。
二、题解
1.递归
1.1 思路
参考了rebellious_robot的题解
- 声明一个父节点指针,协助递归过程
- 向左递归访问,如果孩子节点为空,则返回父节点
- 令孩子节点的左孩子为空
- 孩子节点的右孩子则为:递归访问父节点的右孩子
父节点的作用是为了递归遍历右子树的,如果没有这个父节点,那么在递归函数的一次完整的执行过程中,无法访问递归右子树。
1.2 代码
1 | /** |
2.迭代+构建新树
2.1 思路
- 中序遍历,遍历结果存储在数组中
- 借助数组,创建一颗新树
2.2 代码
1 | struct TreeNode *increasingBST(struct TreeNode *root) |