算法导论--第12章【二叉查找树】
12.1-2
BST:node.left.key < node.key < node.right.key
堆:node.key < node.left.key;node.key<node.right.key
不可以,堆排需要nlgn才可以
12.1-3
使用栈的方法:略
不使用栈的方法:
由于不能够使用栈,那么如果能够正确的遍历一颗树,那么最重要的就是能够回溯到后继节点,那么中序遍历的特点决定了需要找到每一个节点的前驱节点,这样才能够回溯到当前节点继续向后进行。
思路:
1)如果当前节点的左子树为空,则对当前节点进行输出,当前节点变为右子树
2)如果当前节点的左字树非空,则找到当前节点的前驱,
2.1)如果前驱节点的右子树为空,则前驱节点的右子树赋值为当前节点,当前节点为当前节点的左孩子
2.2)如果前驱节点的右子树为当前节点,则说明当前节点是由当前节点的前驱指针更新过来的,也就是说该节点的左子树已经遍历完毕,输出当前节点,将前驱节点的右子树置空,并将当前节点更新为当前节点的右子树
12.1-4 略
12.2-3
TREE_PREDECESSOR(x)
if left(x) == NIL:
return x;
else:
pre = left(x);
while (right(pre)!=NIL) {
pre = pre->right;
}
return pre;
12.2-5
BST:node.left.key < node.key < node.right.key
堆:node.key < node.left.key;node.key<node.right.key
不可以,堆排需要nlgn才可以
12.1-3
使用栈的方法:略
不使用栈的方法:
由于不能够使用栈,那么如果能够正确的遍历一颗树,那么最重要的就是能够回溯到后继节点,那么中序遍历的特点决定了需要找到每一个节点的前驱节点,这样才能够回溯到当前节点继续向后进行。
思路:
1)如果当前节点的左子树为空,则对当前节点进行输出,当前节点变为右子树
2)如果当前节点的左字树非空,则找到当前节点的前驱,
2.1)如果前驱节点的右子树为空,则前驱节点的右子树赋值为当前节点,当前节点为当前节点的左孩子
2.2)如果前驱节点的右子树为当前节点,则说明当前节点是由当前节点的前驱指针更新过来的,也就是说该节点的左子树已经遍历完毕,输出当前节点,将前驱节点的右子树置空,并将当前节点更新为当前节点的右子树
12.1-4 略
12.2-3
TREE_PREDECESSOR(x)
if left(x) == NIL:
return x;
else:
pre = left(x);
while (right(pre)!=NIL) {
pre = pre->right;
}
return pre;
12.2-5
如果curr节点有左子女,那么它的前驱一定是左子女中最右边的节点,否则就不是前驱节点