数据结构概念:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
常用数据结构:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)
算法的意义: 算法研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。
一、树的遍历
树的遍历分为两类:
- 深度优先(DFS)
- 前序遍历
- 中序遍历
- 后序遍历
- 广度优先(BFS)
- 层次遍历
准备:定义节点
public class TreeNode {String value = null; // 根节点TreeNode leftChildren = null; // 左子节点TreeNode rightChildren = null; // 右子节点public TreeNode(String value, TreeNode leftChildren, TreeNode rightChildren) {this.value = value;this.leftChildren = leftChildren;this.rightChildren = rightChildren;}public TreeNode(String value) {this.value = value;}public void setValue(String value) {this.value = value;}public void setLeftChildren(TreeNode leftChildren) {this.leftChildren = leftChildren;}public void setRightChildren(TreeNode rightChildren) {this.rightChildren = rightChildren;}public String getValue() {return value;}public TreeNode getLeftChildren() {return leftChildren;}public TreeNode getRightChildren() {return rightChildren;}}
1、深度优先(DFS)
1.1、前序遍历
思路:先根节点->左子树->右子树;
结构如下:
```java
- 层次遍历
public class TreeSearch {
public TreeNode getTargetTree() {// 叶子节点TreeNode G = new TreeNode("G");TreeNode D = new TreeNode("D");TreeNode E = new TreeNode("E", G, null);TreeNode B = new TreeNode("B", D, E);TreeNode H = new TreeNode("H");TreeNode I = new TreeNode("I");TreeNode F = new TreeNode("F", H, I);TreeNode C = new TreeNode("C", null, F);// 构造根节点TreeNode root = new TreeNode("A", B, C);return root;}/*** 前序遍历 先根节点->左子树->右子树;*/public void preOrderVisitTreeNode(TreeNode node) {if (null != node) {System.out.print(node.value);if (null != node.getLeftChildren()) {preOrderVisitTreeNode(node.getLeftChildren());}if (null != node.getRightChildren()) {preOrderVisitTreeNode(node.getRightChildren());}}}public static void main(String[] args) {TreeTest treeSearch = new TreeTest();TreeNode tree = treeSearch.getTargetTree();System.out.print("前序遍历:");treeSearch.preOrderVisitTreeNode(tree);System.out.println("");}
} //先序遍历:ABDEGCFHI
**1.2、中序遍历**<br /> 思路:先左子树->根节点->右子树;<br />```javapublic class TreeSearch {public TreeNode getTargetTree() {// 叶子节点TreeNode G = new TreeNode("G");TreeNode D = new TreeNode("D");TreeNode E = new TreeNode("E", G, null);TreeNode B = new TreeNode("B", D, E);TreeNode H = new TreeNode("H");TreeNode I = new TreeNode("I");TreeNode F = new TreeNode("F", H, I);TreeNode C = new TreeNode("C", null, F);// 构造根节点TreeNode root = new TreeNode("A", B, C);return root;}/*** 中序遍历 先左子树->根节点->右子树;*/public void inorderVisitTreeNode(TreeNode node) {if (null != node) {if (null != node.getLeftChildren()) {inorderVisitTreeNode(node.getLeftChildren());}System.out.print(node.value);if (null != node.getRightChildren()) {inorderVisitTreeNode(node.getRightChildren());}}}public static void main(String[] args) {TreeTest treeSearch = new TreeTest();TreeNode tree = treeSearch.getTargetTree();System.out.print("中序遍历:");treeSearch.inorderVisitTreeNode(tree);System.out.println("");}}//中序遍历:DBGEACHFI
1.3、后续遍历
思路:先左子树->右子树->根节点;
public class TreeSearch {public TreeNode getTargetTree() {// 叶子节点TreeNode G = new TreeNode("G");TreeNode D = new TreeNode("D");TreeNode E = new TreeNode("E", G, null);TreeNode B = new TreeNode("B", D, E);TreeNode H = new TreeNode("H");TreeNode I = new TreeNode("I");TreeNode F = new TreeNode("F", H, I);TreeNode C = new TreeNode("C", null, F);// 构造根节点TreeNode root = new TreeNode("A", B, C);return root;}/*** 后序遍历 先左子树->右子树->根节点;*/public void postOrderVisitTreeNode(TreeNode node) {if (null != node) {if (null != node.getLeftChildren()) {postOrderVisitTreeNode(node.getLeftChildren());}if (null != node.getRightChildren()) {postOrderVisitTreeNode(node.getRightChildren());}System.out.print(node.value);}}public static void main(String[] args) {TreeTest treeSearch = new TreeTest();TreeNode tree= treeSearch.getTargetTree();System.out.print("后序遍历:");treeSearch.postOrderVisitTreeNode(tree);System.out.println("");}//结果:后序遍历:DGEBHIFCA
2、广度优先
2.1、层次遍历
思路:先根节点,然后第二层,第三层,依次往下走,(同层节点从左往右输出); 
层序遍历:ABCDEFGHI
层序遍历二叉树,是非递归的队列实现的,就是利用队列的先进先出(FIFO)实现的。
public class TreeTest {public TreeNode getTargetTree() {// 叶子节点TreeNode G = new TreeNode("G");TreeNode D = new TreeNode("D");TreeNode E = new TreeNode("E", G, null);TreeNode B = new TreeNode("B", D, E);TreeNode H = new TreeNode("H");TreeNode I = new TreeNode("I");TreeNode F = new TreeNode("F", H, I);TreeNode C = new TreeNode("C", null, F);// 构造根节点TreeNode root = new TreeNode("A", B, C);return root;}/*** 层次遍历*/public void levelOrderVisitTreeNode(TreeNode node) {if (null != node) {LinkedList<TreeNode> list = new LinkedList<>();list.add(node);TreeNode currentNode;while (!list.isEmpty()) {currentNode = list.poll();System.out.print(currentNode.value);if (null != currentNode.getLeftChildren()) {list.add(currentNode.getLeftChildren());}if (null != currentNode.getRightChildren()) {list.add(currentNode.getRightChildren());}}}}public static void main(String[] args) {TreeTest treeSearch = new TreeTest();TreeNode tree = treeSearch.getTargetTree();System.out.print("层次遍历:");treeSearch.levelOrderVisitTreeNode(tree);}}
