两种方法 Find inorder succ of BST

方法一:
如果node的定义有parent reference
就非常直接:
public static BTNode inorderSucc(BTNode e) {
if (e != null) {
BTNode p;

// Found right children -> return 1st inorder node on right
if (e.parent == null || e.right != null) {
p = leftMostChild(e.right);
} else {
// Go up until we’re on left instead of right (case 2b)
while ((p = e.parent) != null) {
if (p.left == e) {
break;
}
e = p;
}
}
return p;
}
return null;
}

public static BTNode leftMostChild(BTNode e) {
if (e == null) {
return null;
}
while (e.left != null) {
e = e.left;
}
return e;
}
如果没有也没关系
加一个
/*感谢崔大神对我这个findParent method做了非常直观有效的改进*/
BTNode findParent(BTNode cur, BTNode n) {
if (cur == null) {
return null;
}
if (cur.left == n || cur.right == n) {
return cur;
}
BTNode father = findParent(cur.left, n);
if (father != null) {
return father;
}
return findParent(cur.right, n);
}
用来找到parent node即可
方法2:这个方法比较耍赖了,就是直接将BST转化成inorder排列的Queue
显然succ就是queue中某点的后面一点。
public void toQueue(Queue<BTNode> q) {
if (root == null) {
return;
} else {
toQueue2(root, q);
while (!q.isEmpty()) {
customer c = (customer) q.dequeue().item;
System.out.println(c.toString());
}
}
}

void toQueue2(BTNode cur, Queue<BTNode> q) {
if (cur == null) {
return;
}
toQueue2(cur.left, q);
q.enqueue(cur);
toQueue2(cur.right, q);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值