基本概念
树
除了根节点之外,每个节点只要一个父节点,根节点没有父节点。除了叶节点之外,所有节点都有一个或者多个节点,叶节点没有子节点。父节点和子节点之间用指针相连。
二叉树
二叉树具有以下性质:
非空二叉树的第n层上至多有2^(n-1)个元素。
深度为h的二叉树至多有2^h-1个结点。
数据结构定义
public class BTNode {
int val; //值
BTNode left; //左子树
BTNode right; //右子树
public BTNode(){
}
public BTNode(int val){
this.val = val;
}
public BTNode(int val, BTNode left, BTNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
二叉树操作:
遍历
遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。
前序遍历:先访问根结点,再访问左子结点,最后访问右子结点
中序遍历:先访问左子结点,再访问根结点,最后访问右子结点
后序遍历:先访问左子结点,再访问右子结点,最后访问根结点
如下图所示二叉树
前序遍历:10 6 4 2 8 14 12 16
中序遍历:2 4 6 8 10 12 14 16
后序遍历:2 4 8 6 12 16 14 10
代码实现:
前序遍历
/**
* 前序遍历
* 先访问根结点,再访问左子结点,最后访问右子结点
* @param root
*/
public void preorder(BTNode root){
//先访问根结点
System.out.print(root.val+" ");
if(root.left!=null){
preorder(root.left);
}
if(root.right!=null){
preorder(root.right);
}
}
中序遍历:
力扣94题
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
dfs(res, root);
return res;
}
void dfs(List<Integer> res, TreeNode root) {
if (root == null) {
return;
}
if (root.left != null) {
dfs(res, root.left);
}
res.add(root.val);
if (root.right != null) {
dfs(res, root.right);
}
}
}