JZ26 二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&&tqId=11179&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
import java.util.ArrayList;
import java.util.List;
public class Solution {
List<Integer> list = new ArrayList<>();
TreeNode head = null;
TreeNode pre = null;
public TreeNode Convert(TreeNode pRootOfTree) {
//方法一:
// if (pRootOfTree==null)
// return null;
// //先中序遍历
// midTree(pRootOfTree);
// //再构建双向链表
// return convert(list);
//方法二:线索化二叉树的构建
// if(pRootOfTree==null){
// return null;
// }
// Convert(pRootOfTree.left);
// if(head==null){
// head = pRootOfTree;
// }
// if(pre!=null){
// pRootOfTree.left = pre;
// pre.right = pRootOfTree;
// }
// pre = pRootOfTree;
// Convert(pRootOfTree.right);
// return head;
//方法三:线索化二叉树不再用一个变量(上面用的head)保存头指针的话是降序,所以我们可以从右子树开始遍历。减少变量的使用
if(pRootOfTree==null){
return null;
}
Convert(pRootOfTree.right);
if(pre!=null){
pRootOfTree.right=pre;
pre.left = pRootOfTree;
}
pre = pRootOfTree;
Convert(pRootOfTree.left);
return pre;
}
public void midTree(TreeNode pRootOfTree){
if(pRootOfTree==null){
return;
}
midTree(pRootOfTree.left);
list.add(pRootOfTree.val);
midTree(pRootOfTree.right);
}
public TreeNode convert(List<Integer> list){
TreeNode head = new TreeNode(list.get(0));
TreeNode cur = head;
for(int i=1;i<list.size();i++){
TreeNode node = new TreeNode(list.get(i));
node.left = cur;
cur.right = node;
cur = node;
}
return head;
}
}