zoukankan      html  css  js  c++  java
  • [GeeksForGeeks] Populate inorder successor for all nodes in a binary search tree

    Given a binary search tree with the following tree node definition.

    next points to a node's inorder successor.

    Populate inorder successor for all nodes in this bst.

     1 class TreeNodeWithNext {
     2     int val;
     3     TreeNodeWithNext left, right, next;
     4     public TreeNodeWithNext(int v) {
     5         this.val = v;
     6         this.left = null;
     7         this.right = null;
     8         this.next = null;
     9     }
    10 }

    Recursive solution using reverse in order traversal.

    Since we need to set each node's next to its inorder successor, in order traversal is the natural way to acheive this.

    We can either traverse in order from smaller value nodes to bigger value nodes or vice versa.

     1 private TreeNodeWithNext prev = null;
     2 public void populateInorderSuccessorRecursion(TreeNodeWithNext root) {
     3     if(root == null) {
     4         return;
     5     }
     6     populateInorderSuccessorRecursion(root.left);
     7     if(prev != null) {
     8         prev.next = root;
     9     }
    10     prev = root;
    11     populateInorderSuccessorRecursion(root.right);
    12 }
     1 public class PopulateInorderSuccessor {
     2     private TreeNodeWithNext next = null;
     3     public void populateInorderSuccessorRecursion(TreeNodeWithNext root) {
     4         if(root == null) {
     5             return;
     6         }
     7         populateInorderSuccessorRecursion(root.right);
     8         root.next = next;
     9         next = root;
    10         populateInorderSuccessorRecursion(root.left);
    11     }
    12 }

    Iterative solution.

    Instead of using recursion, we can use a stack to simulate the recursive process and get the following iterative solution.

     1 public void populateInorderSuccessorIterative(TreeNodeWithNext root) {
     2     if(root == null) {
     3         return;
     4     }
     5     TreeNodeWithNext prev = null, curr = root;
     6     Stack<TreeNodeWithNext> stack = new Stack<TreeNodeWithNext>();
     7     while(curr != null || !stack.isEmpty()) {
     8         while(curr != null) {
     9             stack.push(curr);
    10             curr = curr.left;
    11         }
    12         curr = stack.pop();
    13         if(prev != null) {
    14             prev.next = curr;
    15         }
    16         prev = curr;
    17         curr = curr.right;
    18     }
    19 }
  • 相关阅读:
    学习java随笔第二篇:java开发工具——Eclipse
    GDB
    【转】图像分割(Image Segmentation)
    [转]C#Windows窗体打开图像与保存
    【转】opencv 分水岭算法cvWatershed
    C#中Rectangle(Point, Size) 和Rectangle(Int32, Int32, Int32, Int32) 区别
    【转】数组和图像的转换
    .Net的垃圾回收机制(GC)之拙见——托管类型的垃圾回收
    【动态规划】滚动数组的求解(C++)
    C#编程语言之委托与事件(二)—— C#事件
  • 原文地址:https://www.cnblogs.com/lz87/p/7416246.html
Copyright © 2011-2022 走看看