数据结构复习笔记(Data Structures & Algorithms in Java, 4th)-Trees
2016-12-15 00:40
701 查看
一、树
树是一种以层次架构方式来储存数据的数据结构。除了根节点(Root)以外,其它节点都有一个父节点及可能会有子节点。若节点没有子节点,我们称其为 external node, 又称为 leaves;相反的,若我们称一节点为 internal,则该节点至少有个子节点。
树的常见接口:
树的节点API
所谓节点的高度及深度,指的是自v到树的根的节点数,扣除 v自身;所谓树的高便是所有节点高的最大值。
Preorder Traversal
简单的说,就是一个节点先完成本身,再完成子节点
简单的说,就是在先完成该节点的子节点,再完成该节点
若树具有以下特性,则称其为二叉树:
1. 每个节点最多有二个子节点。
2. 二个子节点分别为左子节点(left child)及右子节点(right child)
3. 子节点中,左子节点在右子节点的前方。
1. T的根节点。
2. 一个二叉树,T的左子树。
3. 一个二叉树,T的右子树。
Inorder Traversal
二叉搜索树(Binary Search Tree)
若 T 为一二叉搜索树,则
1. 任一节点 v 的值可用 x(v) 代表。
2. 左子树所有任一值 <= x(v) 而右子树所有任一值 >= x(v)
3. T的所有 external Node 皆为空,不储存任何的值。
代码在 Github上
树是一种以层次架构方式来储存数据的数据结构。除了根节点(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上
相关文章推荐
- 数据结构复习笔记(Data Structures & Algorithms in Java, 4th) --Memory Management (Heap & Stack)
- 数据结构复习笔记(Data Structures & Algorithms in Java, 4th) --Garbage Collection
- Data Structures & Algorithms in Java ---- Arrays
- Data Structures & Algorithms in Java
- Sesing the Data Structures & Algorithms in Java
- Data Structures and Algorithms in Java
- Algorithms & Data structures in C++& GO ( Lock Free Queue)
- Data Structures and Algorithms in Java
- Information Theory in Data Mining & Decision Trees learning
- 【DataStructure&AlgorithmInJava】Ch02-OrderArray w binarySearch
- Data Structures and Algorithms in Python:Python中的数据结构和算法
- Basic Data Structures and Algorithms in the Linux Kernel
- 【DataStructure&AlgorithmInJava】Ch02-BinarySearchDemo
- 计算机科学类优秀书籍推荐 Mathematics (数学)& Data Structures & Algorithms (数据结构、算法) &Database (数据库)
- If advanced algorithms and data structures are never used in industry, then why learn them?
- How to implement common datastructures (List, Stack, Map) in plain Java - Tutorial
- 【DataStructure&AlgorithmInJava】Ch02-HighArrayDemo
- Sams Teach Yourself Data Structures and Algorithms in 24 Hours
- how to compile source code of "Data Structures & Algorithm Analysis in Java" writen by Mark Allen Weiss
- Fundamentals of OOP and Data Structures in Java