本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下。
有如下的一颗完全二叉树:
先序遍历结果应该为:1 2 4 5 3 6 7
中序遍历结果应该为:4 2 5 1 6 3 7
后序遍历结果应该为:4 5 2 6 7 3 1
层序遍历结果应该为:1 2 3 4 5 6 7
二叉树的先序遍历、中序遍历、后序遍历其实都是一样的,都是执行递归操作。
我这记录一下层次遍历吧:层次遍历需要用到队列,先入队在出队,每次出队的元素检查是其是否有左右孩子,有则将其加入队列,由于利用队列的先进先出原理,进行层次遍历。
下面记录下完整代码(Java实现),包括几种遍历方法:
代码如下 | 复制代码 |
importjava.util.ArrayDeque; importjava.util.ArrayList; importjava.util.List; importjava.util.Queue;
/** * 定义二叉树节点元素 * @author bubble * */ classNode { publicNode leftchild; publicNode rightchild; publicintdata;
publicNode(intdata) { this.data = data; }
}
publicclassTestBinTree {
/** * 将一个arry数组构建成一个完全二叉树 * @param arr 需要构建的数组 * @return 二叉树的根节点 */ publicNode initBinTree(int[] arr) { if(arr.length ==1) { returnnewNode(arr[0]); } List
for(inti =0; i < arr.length; i++) { nodeList.add(newNode(arr[i])); } inttemp =0; while(temp <= (arr.length -2) /2) {//注意这里,数组的下标是从零开始的 if(2* temp +1< arr.length) { nodeList.get(temp).leftchild = nodeList.get(2* temp +1); } if(2* temp +2< arr.length) { nodeList.get(temp).rightchild = nodeList.get(2* temp +2); } temp++; } returnnodeList.get(0); }
/** * 层序遍历二叉树,,并分层打印 * @param root 二叉树根节点 * */ publicvoidtrivalBinTree(Node root) { Queue nodeQueue.add(root); Node temp =null; intcurrentLevel =1; //记录当前层需要打印的节点的数量 intnextLevel =0;//记录下一层需要打印的节点的数量 while((temp = nodeQueue.poll()) !=null) { if(temp.leftchild !=null) { nodeQueue.add(temp.leftchild); nextLevel++;
} if(temp.rightchild !=null) { nodeQueue.add(temp.rightchild); nextLevel++; } System.out.print(temp.data +" "); currentLevel--; if(currentLevel ==0) { System.out.println(); currentLevel = nextLevel; nextLevel =0; } } }
/** * 先序遍历 * @param root 二叉树根节点 */ publicvoidpreTrival(Node root) { if(root ==null) { return; } System.out.print(root.data +" "); preTrival(root.leftchild); preTrival(root.rightchild); } /** * 中序遍历 * @param root 二叉树根节点 */ publicvoidmidTrival(Node root) { if(root ==null) { return; } midTrival(root.leftchild); System.out.print(root.data +" "); midTrival(root.rightchild); } /** * 后序遍历 * @param root 二叉树根节点 */ publicvoidafterTrival(Node root) { if(root ==null) { return;
} afterTrival(root.leftchild); afterTrival(root.rightchild); System.out.print(root.data +" "); }
publicstaticvoidmain(String[] args) { TestBinTree btree =newTestBinTree(); int[] arr =newint[] {1,2,3,4,5,6,7}; Node root = btree.initBinTree(arr); System.out.println("层序遍历(分层打印):"); btree.trivalBinTree(root); System.out.println("n先序遍历:"); btree.preTrival(root); System.out.println("n中序遍历:"); btree.midTrival(root); System.out.println("n后序遍历:"); btree.afterTrival(root);
}
} |
遍历结果:
茶杯头甜蜜终章dlc 官方手机版v1.0.0.3
下载火柴人传说暗影格斗内置菜单 最新版v3.0.1
下载荒野乱斗测试服 安卓版v61.10.3
下载荒野乱斗彩虹服 安卓版v61.10.3
下载寒霜启示录 安卓版v1.25.10
寒霜启示录是一款生存模拟游戏,不少玩家可能对于末日都有着自己
末日城堡免广告版 安卓最新版v0.7.1
末日城堡免广告版是一款非常好玩的模拟经营类游戏,内部可以不看
甜蜜人生模拟器 最新版v1.4.5
甜蜜人生模拟器是一款非常好玩的模拟恋爱手游,玩家在这里能够对
武器锻造师内置功能菜单 v10.4
武器锻造师内置菜单版是游戏的破解版本,在该版本中为玩家提供了
开放空间overfield 安卓版v1.0.5
开放空间Overfield是一款箱庭养成经营手游,让你在广阔