Java中二叉树的建立和各种遍历实例代码

  

这是个常见的面试题,比如说通过二叉树的先序和中序遍历,得到二叉树的层序遍历等问题

  

  

假设现在有个二叉树,如下:

  

癑ava中二叉树的建立和各种遍历实例代码"

  

此时遍历顺序是:

        前序: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中二叉树的建立和各种遍历实例代码