zoukankan      html  css  js  c++  java
  • 《剑指offer》面试题27 二叉搜索树与双向链表 Java版

    (将BST改成排序的双向链表。)

    我的方法一:根据BST的性质,如果我们中序遍历BST,将会得到一个从小到大排序的序列。如果我们将包含这些数字的节点连接起来,就形成了一个链表,形成双向链表也很简单。关键是我们要知道我们在准备连接一个节点时,我们要知道它之前处理的那个节点,也就是小于它的最大一个节点。如果用迭代的方法,这个信息是丢失的,所以我们要用一个变量保存这个节点。下面是中序遍历的迭代方法,处理的过程变成了连接,处理完后更新lasthandle。

        	public TreeNode build(TreeNode root){
        		if(root == null)return null;
        		TreeNode rootMark = root;
        		Stack<TreeNode> stack = new Stack<>();
        		TreeNode lasthandle = null;
        		
        		while(root != null || stack.size()>0){
        			while(root != null){
        				stack.push(root);
        				root = root.left;
        			}
        			if(stack.size()>0){
        				root = stack.pop();
                      
                      	 //开始处理
        				root.left = lasthandle;
        				if(lasthandle != null){
        					lasthandle.right = root;
        				}
                      	 //更新
        				lasthandle = root;
        			
                      	 root = root.right;
        			}
        		}
        		
              	//返回头节点
        		root = rootMark;
        		while(root.left != null){
        			root = root.left;
        		}
        		return root;
        	}
    
    

    我的方法二:也可以采用递归的方法,我们利用递归函数的返回值返回处理好的双向链表的头节点,同时利用一个lastHandle变量保存上一次处理的节点(这个值会在递归函数中更新),这样我们就可以很方便地在递归的中序遍历中进行连接操作了。(但是一直没测试通过,应该是算法出了问题)

  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/czjk/p/11686875.html
Copyright © 2011-2022 走看看