题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解答:
1.思路:添加一个数组存放中序遍历的结果。
public class Q_26 {
List<TreeNode> list=new ArrayList<>();
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
MidSort(pRootOfTree);
return mangeList();
}
public void MidSort(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return;
}
MidSort(pRootOfTree.left);
list.add(pRootOfTree);
MidSort(pRootOfTree.right);
}
public TreeNode mangeList() {
TreeNode pre = list.get(0);
TreeNode tmp;
for (int i = 1; i < list.size(); i++) {
tmp = list.get(i);
tmp.left = pre;
pre.right = tmp;
pre = tmp;
}
return list.get(0);
}}
2.这个方法不需要创建数组
public class Q_26 {
/**
* 参照:https://blog.nowcoder.net/n/7ada22418aba4e01be27ef38d557a41c?f=comment
* 思路:设立一个从尾部遍历到头部的pre节点,在每次递归的时候,把当前节点和pre节点的顺序设置好,然后把pre节点向前移动一个
*/
TreeNode pre = null;
List<TreeNode> list = new ArrayList<>();
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
Convert(pRootOfTree.right);
if (pre == null) {
pre = pRootOfTree;
} else {
pre.left = pRootOfTree;
pRootOfTree.right = pre;
pre = pRootOfTree;
}
Convert(pRootOfTree.left);
return pre;
}}

京公网安备 11010502036488号