前言
Weekly Contest 100的递增顺序查找树,题目要求如下:
给定一个树,按顺序重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
示例 :
输入:[5,3,6,2,4,null,8,1,null,null,null,7,9]
5
/ \
3 6
/ \ \
2 4 8
/ / \
1 7 9
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
1
\
2
\
3
\
4
\
5
\
6
\
7
\
8
\
9
解题思路
这道题解题步骤如下:
- 找出树的最左节点:用中序遍历的方式获取到树的最左节点的访问序列
- 根据这个访问序列生成一个只有右节点的树即可
PS:我个人是把中序遍历简单记做左中右
实现代码
/**
* 递增顺序查找树
*
* @param root
* @return
*/
public TreeNode increasingBST(TreeNode root) {
List<Integer> list = inorderTraversal(root);
TreeNode result = new TreeNode(list.get(0));
TreeNode currentNode = result;
for (int i = 1; i < list.size(); i++) {
currentNode.right = new TreeNode(list.get(i));
currentNode = currentNode.right;
}
return result;
}
/**
* 中序遍历
* @param root
* @return
*/
private List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root!=null){
inorderTraversal(root,list);
}
return list;
}
/**
* 中序遍历时调用的递归方法
* @param root
* @return
*/
private void inorderTraversal(TreeNode root,List<Integer> list){
if(root.left!=null){//遍历左子树
inorderTraversal(root.left,list);
}
list.add(root.val);//记录根节点
if(root.right!=null){//遍历右子树
inorderTraversal(root.right,list);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。