您的位置:首页 > 理论基础 > 数据结构算法

数据结构复习笔记(Data Structures & Algorithms in Java, 4th)-Trees

2016-12-15 00:40 701 查看
一、树
树是一种以层次架构方式来储存数据的数据结构。除了根节点(Root)以外,其它节点都有一个父节点及可能会有子节点。若节点没有子节点,我们称其为 external node, 又称为 leaves;相反的,若我们称一节点为 internal,则该节点至少有个子节点。



树的常见接口:

public interface TreeADT<T> {
int size();

boolean isEmpty();

Iterator<TreeNode<T>> iterator();

void replace(TreeNode<T> oldOne, T newValue);

void addNewNode(TreeNode<T> parent, TreeNode<T> child);

TreeNode<T> root();

TreeNode<T> findNode(T target);

TreeNode<T> parent(TreeNode<T> v);

Iterable<TreeNode<T>> children(TreeNode<T> v);

boolean isInternal(TreeNode<T> v);

boolean isExternal(TreeNode<T> v);

boolean isRoot(TreeNode<T> v);
}


树的节点API

public interface TreeNode<T> {
T getElement();

void setElement(T element);

TreeNode<T> getParent();

void setParent(TreeNode<T> parent);

Iterable<TreeNode<T>> getChildren();

void setChild(TreeNode<T> child);

boolean isInternal();

boolean isExternal();
}
节点深度及树的高度:
所谓节点的高度及深度,指的是自v到树的根的节点数,扣除 v自身;所谓树的高便是所有节点高的最大值。

public static <T> int getNodeDepth(TreeNode<T> node) {
if (isNodeRoot(node)) {
return 0;
} else {
return 1 + getNodeDepth(node.getParent());
}
}

Preorder Traversal
简单的说,就是一个节点先完成本身,再完成子节点



private static <T> void preorderTraversal(TreeNode<T> root) {
System.out.print(root.getElement() + " ");

for (TreeNode<T> childNodes : root.getChildren()) {
preorderTraversal(childNodes);
}
}
Postorder Traversal
简单的说,就是在先完成该节点的子节点,再完成该节点



private static <T> void postorderTraversal(TreeNode<T> root) {
for (TreeNode<T> childNodes : root.getChildren()) {
postorderTraversal(childNodes);
}

System.out.print(root.getElement() + " ");
}
二、二叉树
若树具有以下特性,则称其为二叉树:
1. 每个节点最多有二个子节点。
2. 二个子节点分别为左子节点(left child)及右子节点(right child)
3. 子节点中,左子节点在右子节点的前方。



public interface BTreeADT<T> extends TreeADT<T> {
BTNodeADT<T> getRoot();

void addRoot(BTNodeADT<T> node);

void insertLeft(BTNodeADT<T> target, BTNodeADT<T> node);

void insertRight(BTNodeADT<T> target, BTNodeADT<T> node);

void remove(BTNodeADT<T> target);

void attach(BTNodeADT<T> target, BTreeADT<T> left, BTreeADT<T> right);
}
二叉树节点
public interface BTNodeADT<T> extends TreeNode<T> {
BTNodeADT<T> getLeft();

BTNodeADT<T> getRight();

boolean hasLeft();

boolean hasRight();

void setLeft(BTNodeADT<T> v);

void setRight(BTNodeADT<T> v);
}
我们可一用递归的方式定义二叉树。假设有二叉树T,则T有:
1. T的根节点。
2. 一个二叉树,T的左子树。
3. 一个二叉树,T的右子树。

Inorder Traversal



public static <T> void inorderTraversal(BTNodeADT<T> root) {
if (root.hasLeft()) {
inorderTraversal(root.getLeft());
}

System.out.print(root.getElement()+" ");

if (root.hasRight()) {
inorderTraversal(root.getRight());
}
}


二叉搜索树(Binary Search Tree)

若 T 为一二叉搜索树,则

1. 任一节点 v 的值可用 x(v) 代表。

2. 左子树所有任一值 <= x(v) 而右子树所有任一值 >= x(v)

3. T的所有 external Node 皆为空,不储存任何的值。

代码在 Github上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树 basic 基础