将二叉排序树转换成排序的双向链表

tag: 小米面试题
备注: 小米经典面试题, 多个朋友不同时期,不同研发岗位面试中都碰到过

思路:
(1)二叉序的中序遍历后有序
(2)用一个pre指针辅助

思路二:递归如何做???


  1 package com.zhaochao.tree;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Stack;
  5 
  6 /**
  7  * Created by zhaochao on 17/1/23.
  8  */
  9 public class BST2DLL {
 10 
 11     public ArrayList<TreeNode> bst = new ArrayList<TreeNode>();
 12 
 13 
 14     // 中序遍历
 15     public ArrayList<Integer> inorder(TreeNode root) {
 16         ArrayList<Integer> result = new ArrayList<Integer>();
 17         if(root == null) {
 18             return result;
 19         }
 20 
 21         Stack<TreeNode> stack = new Stack<TreeNode>();
 22 
 23         while(root != null || !stack.isEmpty()) {
 24             while(root != null) {
 25                 stack.push(root);
 26                 root = root.left;
 27             }
 28             TreeNode node = stack.peek();
 29             result.add(node.val);
 30             stack.pop();
 31             root = node.right;
 32         }
 33         return result;
 34     }
 35 
 36 
 37     /*
 38     中序遍历过程中进行指针修改
 39     用一个pre指针指向left孩子
 40     current node 的右孩子为右结点的左左下结点,所以在下一次遍历时修改即可。 pre.next = current node 有点技巧
 41     if(pre != null) { pre.right = node; }
 42     pre = node;
 43     */
 44 
 45     public void bst2DLL(TreeNode root) {
 46 
 47         if(root == null) {
 48             return;
 49         }
 50 
 51         TreeNode pre = null;
 52         Stack<TreeNode> stack = new Stack<TreeNode>();
 53         while(root != null || !stack.isEmpty()) {
 54             while(root != null) {
 55                 stack.push(root);
 56                 root = root.left;
 57             }
 58             TreeNode node = stack.peek();
 59             bst.add(node);
 60             node.left = pre;
 61             if(pre != null) {
 62                 pre.right = node;
 63             }
 64             pre = node;
 65             stack.pop();
 66             root = node.right;
 67         }
 68     }
 69 
 70     public static void main(String[] args) {
 71 
 72         TreeNode root = new TreeNode(0);
 73         TreeNode node1 = new TreeNode(1);
 74         TreeNode node2 = new TreeNode(2);
 75         TreeNode node3 = new TreeNode(3);
 76 
 77         root.left = node1;
 78         root.right = node2;
 79         node2.left = node3;
 80 
 81         BST2DLL test = new BST2DLL();
 82         test.bst2DLL(root);
 83 
 84         for(int i = 0 ; i < test.bst.size(); i++) {
 85             System.out.print(test.bst.get(i).val + " ");
 86             if(test.bst.get(i).left != null) {
 87                 System.out.print("left = "+test.bst.get(i).left.val + " ");
 88             } else {
 89 
 90                 System.out.print("left = null" + " ");
 91             }
 92             if(test.bst.get(i).right != null) {
 93                 System.out.println("right = "+test.bst.get(i).right.val);
 94             } else {
 95                 System.out.println("right = null");
 96             }
 97         }
 98 
 99     }
100 
101 }

 

转载于:https://www.cnblogs.com/superzhaochao/p/6346310.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值