首页 > 编程知识 正文

二叉树的遍历图解例题,二叉树的遍历算法图解

时间:2023-05-03 08:59:16 阅读:157332 作者:3710

两种特殊二叉树的完全二叉树:完全二叉树是一种高效的数据结构,完全二叉树由完全二叉树推导而来。 关于具有深度为k的n个节点的二叉树,只有各个节点在深度为k的满二叉树中与编号从1到n的节点一一对应时,才称为完全二叉树。 需要注意的是,二叉树是一种特殊的完全二叉树。

二叉树是:个二叉树,当各级节点数达到最大值时,该二叉树就是二叉树。 也就是说,如果一个二叉树的层数为k,节点总数为(2^k )-1,那么它就是二叉树

二叉树扫描先进行:扫描根节点后扫描左节点,最后扫描右节点

中顺序扫描:首先扫描左节点,然后扫描右节点,最后扫描根节点

反向遍历:首先遍历左节点,然后遍历右节点,最后遍历根节点

层序遍历:从上到下、从左到右逐层访问树节点的过程为层序遍历

遍历方法的实现首先是建树

用代码创建上述树

class Node { public char val; 公共节点左; 公共节点权限; 公共node (char val ) { this.val=val; } publicclasstesttree { publicstaticnodebuild ()//手动将一棵树改为nodea=newnode ) ' a ); nodeb=newnode(b ); nodec=newnode(c ); noded=newnode(d ); nodee=newnode('e ); nodef=newnode('f ); nodeg=newnode(g ); nodeh=newnode(h ); a.left=b; a.right=c; b.left=d; b.right=e; e.left=g; g.right=h; c.right=f; //返回根节点return a; }然后执行第一次导线测量。

//publicstaticvoidpreorder (node root ) if ) root==null { return; }system.out.print(root.val ' ); reorder(root.left ); reorder(root.right ); }接下来进行中顺序扫描

//publicstaticvoidinorder (node root ) if ) root==null ) { return; }inorder(root.left ); system.out.print(root.val ' ); norder(root.right ); }然后进行后续排线

//publicstaticvoidpostorder (node root ) if ) root==null { return; }postorder(root.left ); postorder(root.right ); system.out.print(root.val ' ); }接下来进行层序遍历

//publicvoidlevelorder (treenode root ) /递归不可用)/queuetreenodequeue=new linked list ) ); queue.offer(root ); //先排队根while (! queue.isEmpty () ({ TreeNode cur=queue.poll ); //到主元素//数据system.out.println(cur.val ' ); //队列左右子树if(cur.left!=null}{queue.offer(cur.left ); (if ) cur.right!=null}{queue.offer(cur.right ); } ) (层序遍历不允许使用递归方法) ) ) ) )。

补充(非递归实现超前/中继/后续遍历) import java.util.Stack; class Node{ public int val; 公共节点左; 公共节点权限; 公共node (intval ) { this.val=val; }publicclasstreenode(/二叉树向前遍历,具有非递归迭代的publicstaticvoidpreorderbyloop (node root ) if ) root==null ) { return; } StackNode stack=new Stack (; stack.push(root ); while (! stack.isEmpty () { Node top=stack.pop; system.out.println(top.val ' ); //将右边的子树和左边的子树分别堆栈if(top.right!=null}{stack.push(top.right ); (if ) top.left!=null}{stack.push(top.left ); }//二叉树的中序遍历,非递归迭代的publicstaticvoidinorderbyloop (node root ) if ) root==null ) { return; } StackNode stack=new Stack (; 节点cur=root; while(true )//1,循环向左查找,将路径上遇到的节点全部堆栈while(cur )!=null}{stack.push(cur ); cur=cur.left; (//2.如果当前堆栈为空,则遍历为if )! stack.isEmpty () ) { break; } Node top=stack.pop (; system.out.println(top.val ' ); cur=top.right; (//二叉树之后的遍历,通过非递归迭代的publicstaticvoidpostorderbyloop (node root ) if ) root==null ) { return; } StackNode stack=new Stack (; 节点cur=root; //prev表示记录了当前访问节点中的最后一个节点(紧接在将要访问的元素之前的节点) Node prev=null。 while(true )//1,循环向左查找,将路径上遇到的节点全部堆栈while(cur )!=null}{stack.push(cur ); cur=cur.left; (//2.如果当前堆栈为空,则遍历为if )! stack.isEmpty () ) { break; (//堆栈顶部元素的值Node top=stack.peek ); 尝试取出//if (top.right==null|| prev==top.right ) system.out.println ) top.val ' ); stack.pop (; //堆栈prev=top; 始终维护prev指向已遍历元素的最后一个(else ) cur=top.right; } } }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。