二叉树(二叉树)是一颗树,其中每个节点都不能有多于两个的儿子。
<强> 1。二叉树节点强>
作为图的特殊形式,二叉树的基本组成单元是节点与边;作为数据结构,其基本的组成实体是二叉树节点(二叉树节点),而边则对应于节点之间的相互引用。
如下,给出了二叉树节点的数据结构图示和相关代码:
//定义节点类: 私有静态类BinNode { 私有对象元素; 私人BinNode lChild;//定义指向左子树的指针 私人BinNode rChild;//定义指向右子树的指针 公共BinNode(对象元素,BinNode lChild, BinNode rChild) { 这一点。元素=元素; 这一点。lChild=lChild; 这一点。rChild=rChild; } } >之前<强> 2。递归遍历强>
二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序。
按惯例左兄弟优先于右兄弟,故若将节点及其孩子分别记作V, L和R,则下图所示,局部访问的次序可有VLR, LVR和液压制动三种选择,根据节点V在其中的访问次序,三种策略也相应地分别称作先序遍历,中序遍历和后序遍历,下面将分别介绍。
<强> 2.1先序遍历强>
图示:
代码实现:
/* * *对该二叉树进行前序遍历结果存储到列表中前序遍历 */公共静态无效预订(BinNode节点){ list.add(节点);//先将根节点存入列表//如果左子树不为空继续往左找,在递归调用方法的时候一直会将子树的根存入列表,这就做到了先遍历根节点 如果节点。lChild !=null) { 预订(node.lChild); }//无论走到哪一层,只要当前节点左子树为空,那么就可以在右子树上遍历,保证了根左右的遍历顺序 如果节点。rChild !=null) { 预订(node.rChild); } } >之前<强> 2.2中序遍历强>
图示:
代码实现:
/* * *对该二叉树进行中序遍历结果存储到列表中 */公共静态无效”(BinNode节点){ 如果节点。lChild !=null) { 有条不紊地进行(node.lChild); } list.add(节点); 如果节点。rChild !=null) { 有条不紊地进行(node.rChild); } } >之前<强> 2.3后序遍历强>
实例图示:
代码实现:
/* * *对该二叉树进行后序遍历结果存储到列表中 */公共静态无效后根次序(BinNode节点){ 如果节点。lChild !=null) { 后根次序(node.lChild); } 如果节点。rChild !=null) { 后根次序(node.rChild); } list.add(节点); } >之前附:测试相关代码
私有静态BinNode根; 私有静态List列表=new ArrayList (); 公共静态void main (String [] args) { init ();//TODO自动生成方法存根//预订(根);//若(根); 后根次序(根); for (int i=0;我& lt;list.size ();我+ +){ System.out.print (list.get(我)。元素+ " "); } }//树的初始化:先从叶节点开始,由叶到根 公共静态孔隙init () { BinNode b=new BinNode (" b ", null, null); BinNode=new BinNode (" a ", null, b); BinNode c=new BinNode (“c”, null); BinNode e=新BinNode (“e”,空,空); BinNode g=new BinNode (“g”,空,空); BinNode f=new BinNode (“f”, e, g); BinNode h=new BinNode (“h”, f, null); BinNode d=new BinNode (d、c、h); BinNode j=new BinNode (“j”,空,空); BinNode k=新BinNode (“k”, j, null); BinNode m=新BinNode (“m”,空,空); BinNode o=new BinNode (“o”,空,空); BinNode p=新BinNode (“p”, o, null); BinNode n=new BinNode (“n”, m, p); BinNode l=new BinNode (“l”, k, n); 根=new BinNode(“我”,d, l); } 图解二叉树的三种遍历方式及java实现代码