目录
1.二叉树结构
2.广度优先搜索二叉树(迭代算法)
3.深度优先搜索二叉树(递归算法)
1.二叉树结构
一个父结点,至多可以连接左右两个子节点
Java构造树结构——其实是 自定义树结点类型
public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(){}TreeNode(int val){this.val = val;}TreeNode(int val,TreeNode lefTreeNode,TreeNode righTreeNode){this.val = val;left = lefTreeNode;right = righTreeNode;}}
2.广度优先搜索二叉树(迭代算法)
原理 :(1)从上到下分层
(2)每层从左往右
解答:
(1)队列(先进先出)来迭代一层内的结点——更新队列,加入存在的左右子结点
(2)直到下一层无结点,循环再停止——该层队列为空
(3)每一层是检索 上一层更新的队列,但队列可能会在本层有新增结点——检索前先记录上一层队列数量,按此数量,一个个弹出队头并检索。
以下是示范代码:
public List<List<Integer>> levelOrder(TreeNode root) {ArrayDeque<TreeNode> deque = new ArrayDeque<TreeNode>();List<List<Integer>> compeleteList = new ArrayList<>();if (root == null) {return compeleteList;}deque.offer(root);while (!deque.isEmpty()) {List<Integer> arrList = new ArrayList<>();int dSize = deque.size();for(int i=0;i<dSize;++i ){TreeNode node = deque.poll();if (node.left != null) {deque.offer(node.left);}if (node.right != null) {deque.offer(node.right);}arrList.add(node.val);}compeleteList.add(arrList);}return compeleteList;}
3.深度优先搜索二叉树(递归算法)
设计思路:
(1)哪里进入下一层
(2)给上一层返回什么
(3)最底层终止条件
实例1:前序遍历
以树中间某一点 作为当前点 思考
(1)不断进入下一层,将左右子节点分别传入,作为下一层根结点
(2)若递归函数有返回值,考虑接收到本层变量,经处理返回上一层
(3)最后一层终止return 一般0,Null或者啥都无,按返回类型决定
ArrayList<Integer> list = new ArrayList<>();public void preorder(TreeNode root){if (root == null) {return;}list.add(root.val);preorder(root.left);preorder(root.right);}
实例2:检测二叉树对称性
public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}return dfs(root.left, root.right);}boolean dfs(TreeNode left,TreeNode right){if (left==null && right == null) {return true;}if (left == null || right == null) {return false;}if (left.val != right.val) {return false;}return dfs(left.left, right.right) && dfs(right.left, left.right);}