这是个常见的面试题,比如说通过二叉树的先序和中序遍历,得到二叉树的层序遍历等问题
假设现在有个二叉树,如下:
此时遍历顺序是:
前序:GDAFEMHZ 有条不紊地进行:ADEFGHMZ 后根次序:AEFDHZMG
现在给出先序(预订)和中序(地),建立一颗二叉树
或者给出中序(地)和后序(后缀次序),建立二叉树,其实是一样的
类树{ char val; 树离开; 树对的; 树树树(char val,左,右){ 这一点。val=val; 这一点。左=左; 这一点。正确的=正确; } 树(){ } 树(char val) { 这一点。val=val; 这一点。左=零; 这一点。正确的=零; } }
公共静态树buildTree (char[]预订,char []”) {//预订是先序序列//为了是手册中序序列 如果(预订==null | |预订。长度==0){ 返回null; } 树根=new树(预订[0]);//找到有条不紊地进行中的根的位置 int inOrderIndex=0; (char我=0;我& lt;inOrder.length;我+ +){ 如果只求[我]==root.val) { inOrderIndex=我; } }//预订的左子树和右子树部分 char [] preOrderLeft=数组。copyOfRange(预订1 1 + inOrderIndex); char [] preOrderRight=数组。copyOfRange(预订1 + inOrderIndex preOrder.length);//若的左子树和右子树部分 char [] inOrderLeft=数组。copyOfRange(有条不紊地进行,0,inOrderIndex); char [] inOrderRight=数组。copyOfRange (inOrder.length有条不紊地进行,inOrderIndex + 1);//递归建立左子树和右子树 树leftChild=buildTree (preOrderLeft inOrderLeft); 树rightChild=buildTree (preOrderRight inOrderRight); 根。左=leftChild; 根。正确的=rightChild; 返回根; }
中序+后序去建树其实是一样的,此处不写了
<强>后序遍历强>
公共静态孔隙postOrderPrint(树根){//后续遍历//左右根 如果(根。离开!=null) { postOrderPrint (root.left); } 如果(根。没错!=null) { postOrderPrint (root.right); } System.out.print(根。val + " "); }
举一反三,先序和中序是一样的,此处不写了
<强>层序遍历强>
可以用一个队列队列,初始先把根节点加入到队列,当队列不为空的时候取队列头的节点节点,打印节点的节点值,如果节点的左右孩子不为空将左右孩子加入到队列中即可
公共静态孔隙layerOrderPrint(树根){ 如果(root==null) { 返回; }//层序遍历 Queue量化宽松政策=new LinkedList (); qe.add(根); 而(! qe.isEmpty ()) { 树节点=qe.poll (); System.out.print(节点。val + " "); 如果节点。离开!=null) { qe.add (node.left); } 如果节点。没错!=null) { qe.add (node.right); } } }
<强>深度优先和广度优先强>
其实就是换个说法而已,深度优先不就是先序遍历嘛,广度优先就是层序遍历
公共静态孔隙deepFirstPrint(树根){//深度优先遍历等价于先序遍历//所以可以直接使用先序遍历 如果(root==null) { 返回; } System.out.print(根。val + " "); 如果(根。离开!=null) { deepFirstPrint (root.left); } 如果(根。没错!=null) { deepFirstPrint (root.right); } } 公共静态孔隙deepFirstPrintNoneRec(树根){//深度优先遍历的非递归形式 如果(root==null) { 返回; } Stack圣=new Stack (); st.add(根); 而(! st.isEmpty ()) { 树节点=st.pop (); System.out.print(节点。val + " ");//栈是后进先出的//先加右孩子后加左孩子 如果节点。没错!=null) { st.add (node.right); } 如果节点。离开!=null) { st.add (node.left); } } }
<强>主要函数:强>
公共静态void main (String [] args) { char[]预订=" GDAFEMHZ " .toCharArray (); char []”=癆DEFGHMZ”.toCharArray (); 树根=主要。buildTree(预订,有条不紊地进行);//Main.postOrderPrint(根);//后序遍历//Main.layerOrderPrint(根);//层序遍历//Main.deepFirstPrint(根);//深度优先遍历//Main.deepFirstPrintNoneRec(根);//深度优先遍历的非递归版本 }Java中二叉树的建立和各种遍历实例代码