zoukankan      html  css  js  c++  java
  • Solution 1: BST转双向链表

    问题描述

    将一棵二叉查找树(BST)转为有序的双向链表。

    例如,有一颗BST如下:

    2

    |  

    1    3

    转成双向链表为:

    1=2=3

    解决思路


    1. 保持有序:中序遍历;

    2. 双向链表:记录链表的头节点,遍历过程中记录前一个节点并且保持双向连接关系。

    程序

    class TreeNode {
    	public int val;
    	public TreeNode left;
    	public TreeNode right;
    
    	public TreeNode(int _val) {
    		val = _val;
    	}
    }
    
    class BSTToDoublyLinkedList {
    	public TreeNode convertToDoublyLinkedList(TreeNode root) {
    		if (root == null) {
    			return null;
    		}
    
    		TreeNode head = new TreeNode(0);
    		TreeNode pre = new TreeNode(0);
    		convertHelper(root, head, pre);
    		return head.left;
    	}
    
    	private void convertHelper(TreeNode root, TreeNode head, TreeNode pre) {
    		if (root == null) {
    			return;
    		}
    		convertHelper(root.left, head, pre);
    		if (head.left == null) {
    			head.left = root; // record the head
    		} 
    		if (pre.left == null) {
    			pre.left = root;
    		} else {
    			pre.left.right = root;
    			root.left = pre.left;
    			pre.left = root; // to next
    		}
    		convertHelper(root.right, head, pre);
    	}
    }
    

      

    附加测试程序:

    public class ConvertTest {
    	public static void main(String[] args) {
    		TreeNode n2 = new TreeNode(3);
    		n2.left = new TreeNode(1);
    		n2.left.right = new TreeNode(2);
    
    		BSTToDoublyLinkedList toDoublyLinkedList = new BSTToDoublyLinkedList();
    		TreeNode head = toDoublyLinkedList.convertToDoublyLinkedList(n2);
    		printDoublyLinkedList(head);
    	}
    
    	private static void printDoublyLinkedList(TreeNode head) {
    		TreeNode node = head;
    		TreeNode last = null;
    
    		System.out.println("left --> right");
    		while (node != null) {
    			System.out.print(node.val + " ");
    			if (node.right == null) {
    				last = node;
    			}
    			node = node.right;
    		}
    		
    		System.out.println();
    		System.out.println("right --> left");
    
    		while (last != null) {
    			System.out.print(last.val + " ");
    			last = last.left;
    		}
    	}
    }
    

    时间/空间复杂度

    时间复杂度:中序遍历的时间复杂度,O(n);

    空间复杂度:O(h),递归栈。

  • 相关阅读:
    手机网络制式常识
    合并两个有序数组a和b到c
    N皇后问题
    数独求解
    ARM处理器模式
    ARM异常中断处理
    国风·召南·野有死麕
    八大排序算法
    1045 Favorite Color Stripe (最长不下降子序列 LIS 或最长公共子序列 LCS)
    1066 Root of AVL Tree (模拟AVL建树)
  • 原文地址:https://www.cnblogs.com/harrygogo/p/4605841.html
Copyright © 2011-2022 走看看