树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。
a.节点的度:该节点子树的个数;如上图:a的度为6,j的度为2
b.树的度:该树中,最大结点的度就是该数的度;如上图:树的度为6
c.叶子节点(终端节点):度为0的节点(没有子树的节点)
d.双亲结点/父节点:如上图:d是h的父节点
孩子节点/子节点:如上图:h是d的子节点
e.根节点:没有双亲的节点;如上图:a
f.节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
g.树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
每个节点最多只有两颗子树,度<=2.
a.满二叉树:非子叶度都为2
b.完全二叉树:满二叉树缺了“右下角”
a.满二叉树
1.高度为k,则有2^k-1个节点
2.层次为k,则该层有2^(k-1)个节点
3.边个数 = 节点个数 – 1
4.度为0有n0个,度为2有n2个,则 n0 = n2 + 1
b.完全二叉树
1.有右孩子必有左孩子
2.只可能有一个度为1的节点
二叉树的存储结构分为:顺序存储和类似于链表的链式存储。
顺序存储:只能存完全二叉树
链式存储:普通二叉树
本次展示链式存储
二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式 ,
以此图为例, 具体如下:
// 孩子表示法private static class treenode{ char val; treenode left; treenode right; public treenode(char val) { this.val = val; }}
初始化:
public static treenode build(){ treenode nodea=new treenode('a'); treenode nodeb=new treenode('b'); treenode nodec=new treenode('c'); treenode noded=new treenode('d'); treenode nodee=new treenode('e'); treenode nodef=new treenode('f'); treenode nodeg=new treenode('g'); treenode nodeh=new treenode('h'); nodea.left=nodeb; nodea.right=nodec; nodeb.left=noded; nodeb.right=nodee; nodee.right=nodeh; nodec.left=nodef; nodec.right=nodeg; return nodea; }
2.6.银行b1 二叉树的遍历 (递归)
1. nlr :前序遍历 (preorder traversal 亦称先序遍历 )—— 访问根结点 —> 根的左子树 —> 根的右子树。
//先序遍历 : 根左右 public static void preorder(treenode root){ if(root==null){ return; } system.out.print(root.val+" "); preorder(root.left); preorder(root.right); }
2. lnr :中序遍历 (inorder traversal)—— 根的左子树 —> 根节点 —> 根的右子树。
//中序遍历 public static void inorder(treenode root){ if(root==null){ return; } preorder(root.left); system.out.print(root.val+" "); preorder(root.right); }
3. lrn :后序遍历 (postorder traversal)—— 根的左子树 —> 根的右子树 —> 根节点。
//后序遍历 public static void postorder(treenode root){ if(root==null){ return; } preorder(root.left); preorder(root.ri写友情的诗ght); system.out.print(root.val+" "); }
2.6.2 二叉树的遍历 (迭代)
1.前序遍历
//方法2(迭代) //先序遍历 (迭代) public static void preordernonrecursion(treenode root){ if(root==null){ return ; } deque<treenode> stack=new linkedlist<>(); stack.push(root); while (!stack.impty()){ treenode cur=stack.pop(); system.out.print(cur.val+" "); if(cur.right!=null){ stack.push(cur.right); } if(cur.left!=null){ stack.push(cur.left); } } }
2.中序遍历
//方法2(迭代) //中序遍历 (迭代) public static void inordertraversalnonrecursion(treenode root) { if(root==null){ return ; } deque<treenode> stack=new linkedlist<>(); // 当前走到的节点 treenode cur=root; while (!stack.impty() || cur!=null){ // 不管三七二十一,先一路向左走到根儿~ while (cur!=null){ stack.push(cur); cur=cur.left; } // 此时cur为空,说明走到了null,此时栈顶就存放了左树为空的节点 cur=stack.pop(); system.out.print(cur.val+" "); // 继续访问右子树 cur=cur.right; } }
3.后序遍历
//方法2(迭代) //后序遍历 (迭代) public static void postordernonrecursion(treenode root){ if(root==null){ return; } deque<treenode> stack=new linkedlist<>(); treenode cur=root; treenode prev=null; while (!stack.impty() || cur!=null){ while (cur!=null){ stack.push(cur); cur=cur.left; } cur=stack.pop(); if(cur.right==null || prev==cur.right){ system.out.print(cur.val+" "); prev=cur; cur=null; }el { stack.push(cur); cur=cur.right; } } }
2.6.3 二叉树的基本操作
1.求结点个数(递归&迭代)
//方法1(递归) //传入一颗二叉树的根节点,就能统计出当前二叉树中一共有多少个节点,返回节点数 //此时的访问就不再是输出节点值,而是计数器 + 1操作 public static int getnodes(treenode root){ if(root==null){ return 0; } return 1+getnodes(root.left)+getnodes(root.right); } //方法2(迭代) //使用层序遍历来统计当前树中的节点个数 public static int getnodesnorecursion(treenode root){ if(root==null){ return 0; } int size=0; deque<treenode> que福州教育学院一附小ue=new linkedlist<>(); queue.offer(root); while (!queue.impty()) { treenode cur = queue.poll(); size++; if (cur.left != null) { queue.offer(cur.left); } if (cur.right != null) { queue.offer(cur.right); } } return size; }
2.求叶子结点个数(递归&迭代)
//方法1(递归) //传入一颗二叉树的根节点,就能统计出当前二叉树的叶子结点个数 public static int getleafnodes(treenode root){ if(root==null){ return 0; } if(root.left==null && root.right==null){ return 1; } return getleafnodes(root.left)+getleafnodes(root.right); } //方法2(迭代) //使用层序遍历来统计叶子结点的个数 public static int getleafnodesnorecursion(treenode root){ if(root==null){ return 0; } int size=0; deque<treenode> queue=new linkedlist<>(); queue.offer(root); while (!queue.impty()){ treenode cur=queue.poll(); if(cur.left==null && cur.right==null){ size++; } if(cur.left!=null){ queue.offer(cur.left); } if(cur.right!=null){ queue.offer(cur.right); } } return size; }
3.求第 k 层结点个数
//求出以root为根节点的二叉树第k层的节点个数 public static int getklevelnodes(treenode root,int k){ if(root==null || k<=0){ return 0; } if(k==1){ return 1; } return getklevelnodes(root.left,k-1)+getklevelnodes(root.right,k-1); }
4.求树的高度
//传入一个以root为根节点的二叉树,就能求出该树的高度 public static int height(treenode root){ if(root==null){ return 0; } return 1+ math.max(height(root.left),height(root.right)); }
5.判断二叉树数中是否存在值为value的节点
//判断当前以root为根节点的二叉树中是否包含指定元素val, //若存在返回true,不存在返回fal public static boolean contains(treenode roo小学生课堂礼仪t,char value){ if(root==null){ return fal; } if(root.val==value){ return true; } return contains(root.left,value) || contains(root.right,value); }
//层序遍历 public static void levelorder(treenode root) { if(root==null){ return ; } // 借助队列来实现遍历过程 deque<treenode> queue =new linkedlist<>(); queue.offer(root); while市场调查方案 (!queue.impty()){ int size=queue.size(); for (int i = 0; i < size; i++) { treenode cur=queue.poll(); system.out.print(cur.val+" "); if(cur.left!=null){ queue.offer(cur.left); } if(cur.right!=null){ queue.offer(cur.right); } } } }
二叉树完整代码见下节:
以上就是详解java中二叉树的基础概念(递归&迭代)的详细内容,更多关于java二叉树的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-06 04:32:18,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/3bc73526ee4e682d94de6397278c59cd.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:详解Java中二叉树的基础概念(递归&迭代).doc
本文 PDF 下载地址:详解Java中二叉树的基础概念(递归&迭代).pdf
留言与评论(共有 0 条评论) |