/*
* 面试题36:二叉搜索树与双向链表
* 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
* 思路:1、将左子树构成双链表,并返回该链表的头节点(左子树最左边的节点)
* 2、定位到左链表的最后一个节点(左子树最右边的节点)
* 3、如果左子树链表不为空,则将当前root追加到左子树链表后
* 4、将右子树构造成双向链表,并返回链表头结点(右子树最左边的节点)
* 5、如果右子树链表不为空,将右子树链表追加到当前root后
* 6,根据左子树链表是否为空返回的整体双向链表的头节点
*/
class TreeNode7 {
int val = 0;
TreeNode7 left = null;
TreeNode7 right = null;
public TreeNode7(int val) {
this.val = val;
}
}
public class No36Convert {
public static void main(String[] args) {
TreeNode7 root = new TreeNode7(10);
TreeNode7 node6 = new TreeNode7(6);
TreeNode7 node14 = new TreeNode7(14);
TreeNode7 node4 = new TreeNode7(4);
TreeNode7 node8 = new TreeNode7(8);
TreeNode7 node12 = new TreeNode7(12);
TreeNode7 node16 = new TreeNode7(16);
root.left = node6;
root.right = node14;
node6.left = node4;
node6.right = node8;
node14.left = node12;
node14.right = node16;
TreeNode7 head = Convert(root);
if(head == null){
System.out.println("head == null");
}
TreeNode7 node = head;
while(node != null){
System.out.println(node.val);
node = node.right;
}
}
//Convert函数把一个二叉搜索树变成一个有序的双向链表,返回双向链表的头结点,参数root为二叉搜索树
public static TreeNode7 Convert(TreeNode7 pRootOfTree) {
if(pRootOfTree==null){//假如根节点为空,返回空
return null;
}
if(pRootOfTree.left==null&&pRootOfTree.right==null){//假如只有一个根节点,则返回根节点
return pRootOfTree;
}
//1、将左子树构造成双链表,并返回该链表头结点left
TreeNode7 left=Convert(pRootOfTree.left);
//2、定位到左子树链表的最后一个节点(左子树最右边的节点)
TreeNode7 p=left;//创建一个临时节点P,用来遍历找到左链表的最后一个节点(左子树最右边的节点),p初始化指向做左子树的根节点,
while(p!=null&&p.right!=null){
p=p.right;//最终p为左子树最右边的节点
}
//3、如果左子树链表不为空,将当前root追加到左子树链表后
if(left!=null){//左子树链表不为空
p.right=pRootOfTree;//左子树链表的最后一个节点p(左子树最右边节点)的右指针指向当前root节点
pRootOfTree.left=p;//当前root节点的左指针指向左子树链表的最后一个节点p(左子树最右边节点)
}
//4、将右子树构造成双链表,并返回该链表的头结点right
TreeNode7 right=Convert(pRootOfTree.right);
//5、如果右子树链表不为空,将右子树链表追加到当前root后
if(right!=null){//右子树链表不为空
right.left=pRootOfTree;//右子树链表的头结点right的左指针指向当前root
pRootOfTree.right=right;//当前root的右指针指向右子树链表的头结点right
}
return left!=null?left:pRootOfTree;//根据左子树链表是否为空返回整个双向链表的头指针。
}
}
面试题36:二叉搜索树与双向链表
最新推荐文章于 2022-05-13 21:54:01 发布