剑指offer(26)二叉搜索树与双向链表

    xiaoxiao2024-10-18  75

    package java_jianzhioffer_algorithm; /** * 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。 * @author hexiaoli * 思考: * 二叉搜索树的中序遍历的序列,就是排序的顺序。 根据排序双向链表的定义,根结点将和它的左子树的最大一个结点链接起来,同时它还将和它右子树最小的结点链接起来。 在中序遍历过程中,当遍历到根结点时,它的左子树已经转换成一个排序的好的双向链表 并且当前指针指向链表中最后一个的结点。将其与根结点链接起来,此时根结点就成了最后一个结点, 接着遍历右子树,并把根结点和右子树中最小的结点链接起来。 */ class TreeNodec{ int val = 0; TreeNodec left = null; TreeNodec right = null; public TreeNodec(int val) { this.val = val; } } public class Convert { //双向链表的左边头结点和右边头节点 static TreeNodec leftHead = null; static TreeNodec rightHead = null; public static TreeNodec convert(TreeNodec pRootOfTree) { //递归调用叶子节点的左右节点返回null if(pRootOfTree==null) return null; //第一次运行时,它会使最左边叶子节点为链表第一个节点 convert(pRootOfTree.left); if(rightHead==null){ leftHead= rightHead = pRootOfTree; }else{ //把根节点插入到双向链表右边,rightHead向后移动 rightHead.right = pRootOfTree; pRootOfTree.left = rightHead; rightHead = pRootOfTree; } //把右叶子节点也插入到双向链表(rightHead已确定,直接插入) convert(pRootOfTree.right); //返回左边头结点 return leftHead; } public static void main(String[] args) { TreeNodec pRootOfTree = new TreeNodec(4); TreeNodec left1 = new TreeNodec(2); TreeNodec right1 = new TreeNodec(6); TreeNodec left2 = new TreeNodec(1); TreeNodec right2 = new TreeNodec(3); TreeNodec left3 = new TreeNodec(5); TreeNodec right3 = new TreeNodec(7); pRootOfTree.left=left1; pRootOfTree.right=right1; left1.left=left2; left1.right=right2; right1.left=left3; right1.right=right3; TreeNodec result ; result = convert(pRootOfTree); System.out.println(result.val); } }

     

    最新回复(0)