我的项目希望我打印出二元搜索树的前身和后继者。赋值要求我将节点的数据作为参数传递。当我尝试打印出给定节点数据的前身时,它给了我0.我不知疲倦地尝试如何解决问题但没有发现在哪里。希望你能找到问题所在。
以下是方法:
public void findPredecessor(Node root, int data)
{
int predecessor = 0;
if(root != null)
{
if(root.data == data)
{
if(root.left != null)
{
Node n = root.left;
while(n.right != null) n = n.right;
predecessor= n.data;
}
}
else if(root.data < data)
{
predecessor = root.data;
findPredecessor(root.left, data);
}
}
System.out.print(predecessor);
}
public void printPredecessor(int data)
{
findPredecessor(root, data);
}
答案 0 :(得分:0)
这是我想到的正确方法的伪代码:
Shape -> Shape -> Bool
如果root为NULL ,则返回
如果找到密钥则
mappend x mempty == mappend mempty x == x
返回
如果 键较小,则根节点将后续设置为root
并递归搜索到左子树
其他 将前任设置为root 并递归搜索到 右子树
编辑:如果后继者或前任者返回null print null。
Data.Monoid
希望它有所帮助!
答案 1 :(得分:0)
您可以使用inOrder遍历在二叉搜索树中找到节点的前导和后继。 inOrder遍历的基本结构是:
inOrder(Node n)
if (n == null) return;
inOrder(n.left)
visit(n)
inOrder(n.right)
在这种情况下,当我们访问一个节点时,我们想要跟踪我们已经看到的前任,匹配节点和后继节点。这是基本逻辑:
visit(n)
if n.val == searchVal
match = n
else if match == null
predecessor = n
else if successor == null
successor = n;
这里有一些Java代码。我使用一个简单的3元素数组来存储前任,匹配和后继。
class Node
{
int val;
Node left, right;
}
static void inOrder(Node n, int val, Node[] seq)
{
if(n == null) return;
inOrder(n.left, val, seq);
if(n.val == val)
seq[1] = n;
else if(seq[1] == null)
seq[0] = n;
else if(seq[2] == null)
seq[2] = n;
inOrder(n.right, val, seq);
}
public static void main(String[] args)
{
Node root = buildTree();
int searchVal = Integer.parseInt(args[0]);
Node[] seq = new Node[3];
inOrder(root, searchVal , seq);
System.out.println("Predecessor: " + seq[0]);
System.out.println("Match: " + seq[1]);
System.out.println("Successor: " + seq[2]);
}