一、树的概念
节点的度: 一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
树的度: 一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
叶子节点: 度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
子节点: 一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
根结点: 一棵树中,没有双亲结点的结点;如上图:A
节点的层次: 从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
树的高度或深度: 树中节点的最大层次; 如上图:树的高度为4
判断一个结构是否是树结构:
如果一个结构是树结构,那么他的子树是不相交的,且除了根节点外,每个结点有且仅有一个父节点,一颗N个节点的树有N-1条边。
二、二叉树
特点: 每个结点最多有两棵子树,即二叉树不存在度大于2的结点,二叉树的子树有左右之分,其子树的次序不能颠倒。
二叉树的遍历
1.NLR:前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
递归写法
public void preOrderTraversal(Node root){
if (root == null){
return ;
}
System.out.print(root.val);
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
非递归写法:
public void preOrderTraversal(Node root){
Stack<Node> stack = new LinkedList<>();
TreeNode cur = root;
while(!Stack.isEmpty() || cur!=null){
while (cur != null){
System.out.print(cur.val);
stack.push(cur);
cur = cur.left;
}
Node top = stack.pop();
cur = top.right;
}
}
2.LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
public void inOrderTraversal(Node root){
if(root == null){
return;
}
inOrderTraversal