【问题标题】:Validating a BST验证 BST
【发布时间】:2020-11-25 14:25:10
【问题描述】:

关于通过顺序遍历验证 BST 的一个简单问题

public boolean isValidBST(TreeNode root) {
   if (root == null) return true;
   Stack<TreeNode> stack = new Stack<>();
   TreeNode pre = null;
   while (root != null || !stack.isEmpty()) {
      while (root != null) {
         stack.push(root);
         root = root.left;
      }
      root = stack.pop();
      if(pre != null && root.val <= pre.val) return false;
      pre = root;
      root = root.right;
   }
   return true;
}

冒着听起来很傻的风险,倒数第二行 root = root.right 的意义何在,因为它不会在 while 循环的下一次迭代之后立即重新分配给 root = stack.pop()

【问题讨论】:

  • 内部while循环将首先通过左孩子下降。
  • 我知道。我的问题是 root = root.right 有什么意义?
  • 你必须以某种方式找到合适的孩子。
  • 但是当你声明 root = stack.pop() 时它不会立即被替换吗?
  • 只有当它为空时。

标签: algorithm binary-search-tree inorder


【解决方案1】:

倒数第二行 root = root.right 的意义是什么

如果你不访问节点的右子节点,你实际上是在一次又一次地处理同一个节点..等等,你总是会陷入无限循环。

在 while 循环的下一次迭代之后,它不会立即重新分配给 root = stack.pop() 吗?

没有。

 while (root != null) {
     stack.push(root);
     root = root.left;
  }
  root = stack.pop();

到目前为止,您位于树的最左侧节点。在您遍历当前节点的右子节点之前,它将始终指向同一个节点。

请看以下内容:

        4
       / 
      3 
     / 
    2
   / \
   1  0

在内部 while 循环之后,您的堆栈将如下所示:4->3->2->1 除非您分别访问 1 和 2 的右子节点,否则它将始终在 2 和 1 节点之间循环。

因此,

root = root.right;

终止循环并遍历树的所有节点非常重要。

来自印度的晚安!

【讨论】:

  • 抱歉再次询问,但假设我有以下树: //////2 //1 /////3 所以在内部 while 循环之后,堆栈看起来像 [2 , 1] 我们将 1 从堆栈中弹出,所以 root = 1。root = root.right 所以 root = null。 While Loop 再次运行: Stack is just [ 2 ] root = stack.pop() 所以 root = 2. root = root.right 所以 root = 3。这个流程正确吗?
猜你喜欢
  • 2022-11-24
  • 1970-01-01
  • 2020-03-14
  • 2018-05-26
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多