17.13 BST转换成双向链表。

思路:递归执行,子函数需要返回子链表的head和tail,所以借助内部类NodePair来实现。

/**
 * 

         4
       /         2     5
     / \         1   3     6
   /
  0

  0<=>1<=>2<=>3<=>4<=>5<=>6

 *
 */
public class Solution {

    public TreeNode BSTtoDLL(TreeNode root) {
        TreeNode res = BSTtoList(root).head;
        return res;
    }

    private NodePair BSTtoList(TreeNode root) {
        if (root == null)
            return null;
        NodePair leftPair = BSTtoList(root.left);
        NodePair rightPair = BSTtoList(root.right);
        if (leftPair != null) {
            leftPair.tail.right = root;
            root.left = leftPair.tail;
        }

        if (rightPair != null) {
            root.right = rightPair.head;
            rightPair.head.left = root;
        }
        TreeNode newHead = root;
        TreeNode newTail = root;
        if (leftPair != null) {
            newHead = leftPair.head;
        }
        if (rightPair != null) {
            newTail = rightPair.tail;
        }

        return new NodePair(newHead, newTail);

    }

    private static class NodePair {
        TreeNode head;
        TreeNode tail;

        public NodePair(TreeNode head, TreeNode tail) {
            this.head = head;
            this.tail = tail;
        }

    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(4);
        root.left = new TreeNode(2);
        root.right = new TreeNode(5);
        root.left.left = new TreeNode(1);
        root.left.right = new TreeNode(3);
        root.left.left.left = new TreeNode(0);
        root.right.right = new TreeNode(6);

        System.out.println(new Solution().BSTtoDLL(root));

    }
}
时间: 2024-10-26 22:31:50

17.13 BST转换成双向链表。的相关文章

栈和队列----将搜索二叉树转换成双向链表

将搜索二叉树转换成双向链表 对于BST 来说,有本身的值域,有指向左孩子和右孩子的两个指针:对于双向链表来说,有本身的值域,有指向上一个节点和下一个节点的指针.将这个BST转换成双向链表,对于每一个节点来说,原来的right指针等价于转换后的next指针,原来的left指针等价于转换后的left指针,最后返回双向链表的头节点. [解析] 用队列等容器收集二叉树 中序遍历的结果的方法.其时间复杂度是O(N),空间复杂度是O(N). 1. 生成一个队列,记为queue,按照二叉树的中序遍历的顺序,将

新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)

题目:将一个二叉查找树按照中序遍历转换成双向链表. 给定一个二叉查找树: 4 / 2 5 / 1 3 返回 1<->2<->3<->4<->5. 思路:如果对于当前节点,把右子树转换成双向链表,然后把左子树转换成双向链表,转换的时候我们都标记了链表的头节点和尾节点,那么只需要将当前节点和左子树的尾部相连,和右子树的头部相连即可. Java代码:这个是借鉴九章里面的解题法.但是对于左右子树转换成二叉树也不是很理解,还待需要继续分析. /** * Definit

17.把字符串转换成整数atoi

http://zhedahht.blog.163.com/blog/static/25411174200731139971/ 代码如下: bool bValid = true; int str2int_core(const char *digit,bool minus) { long long sum = 0; int flag = minus ? -1:1; while(*digit!='\0') { if (*digit>='0'&&*digit<='9') { sum =

中国标准时间(如:2019-08-20 17:43)转换成格林尼治时间方式方法

function formatDateT(dateTime){ // 中国标准时间(2019-08-20 17:43)转换成格林尼治时间 var timestamp = dateTime; var newDate = new Date(dateTime + 8 * 3600 * 1000); return newDate.toISOString(); }, var dealDate = '2019-08-20 17:43'; const geLinDate = formatDateT(new D

Cracking-- 17.13 将二叉树转换成双向链表

在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子树来说 root->right = right-> -> -> left; left->left 为根的根   的根 而right->left 则为直接的根 #include <iostream> #include <vector> using na

左神算法书籍《程序员代码面试指南》——2_12将搜索二叉树转换成双向链表

对二叉树的节点来说,有本身的值域,有指向左孩子和右孩子的两个指针:对双向链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针.在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表. 1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 struct treeNode 5 { 6 int v; 7 treeNode *l, *r; 8 treeNode(int a =

二叉搜索树转换成双向链表

好一点点就是好一点点嘛 RT 传入3个参数 <根节点,上次访问的节点,头结点>.Yahoo二面被问到!完跪.... 1 void BST2DoubleList(TreeNode *root, TreeNode *& prev, TreeNode *& head) { 2 if (root == NULL) 3 return; 4 BST2DoubleList(root->left, prev, head); 5 root->left = prev; 6 if (pr

二叉树转换成双向链表

*.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:#99ccff;}*.hl_mark_KMSmartTagYellowImg{background-color:#ffff66;}*.hl_mark_KMSmartTagOrangeImg{background-color:#ffad5b;}*.hl_mark_KMSmartTagGreenImg{b

将二叉树转换成双向链表

思路:采用中序遍历的方法,visit函数需要完成的功能为: 1.当前节点的左子节点指向上一次访问的节点: 2.将上一次访问节点的右子节点指向当前节点: 3.最后更新上一次访问节点为当前节点. 在第二步时需要判断上一次访问节点是不是为NULL,如果是,则第二步改为链表的头结点指向当前节点. 程序如下: struct BSTnode { int data; BSTnode * left; BSTnode * right; }*pList,*pHead; void visit(BSTnode * pC