二叉树深度优先遍历的递归实现一、深度优先遍历二、先后遍历1 .算法思路2 .代码实现三、中序遍历1 .算法思路2 .代码实现四、后序遍历1 .算法思路2 .
一.深度优先遍历
每个可分支路径都不会进一步深入,每个节点只能访问一次。
需要特别注意的是,二叉树的深度优先扫描比较特殊,可以细分为先序扫描、中序扫描、后序扫描。 具体说明如下。
第一次遍历:对于任何子树,首先访问根,然后遍历其左侧的子树,最后遍历其右侧的子树。 即根、左、右
中顺扫描(对于任何一个子树,首先扫描其左子树,然后访问根,最后扫描其右子树。 左、根、右
最后遍历:对于任何子树,首先遍历其左侧的子树,然后遍历其右侧的子树,最后访问根。 即,左、右、根
http://www.Sina.com/http://www.Sina.com /
二、超前扫描1 .算法思路超前扫描在访问二叉树节点时采用的是根、左、右方式。
上图所示二叉树的最初扫描是ABDGHCEIF
实现超前遍历的思路非常简单,巧用“递归”就可以了。
//树开头的preordertraversalvoidpreorder (node * node ) ) if ) node!=null(printf('%d ',node-data ); //根preorder(node-left ); //左子树preorder(node-right ); //右部分树}2.代码实现let preorderArr=[] //存储遍历结果的数组functionpreorder(node ) if (node ) ) preorder arr.push (node.) ) preorder(node.rchild ); }preorder(tree ); console.log(preorderarr; 执行结果:
三、中顺扫描1 .算法思路中顺扫描在访问二叉树节点时采用的方式是先左,再根,再右。
上图所示的二叉树中的顺序扫描是GDHBAEICF
巧用递归,与先后顺序代码只有一个顺序不同:
//树中顺序为in-ordertraversalvoidinorder (node * node ) ) if ) node!=null(inorder(node-left ) ); printf('%d ',node-data ); 节点(node-right ); }2.代码实现//按中顺序letinorderarr=[ ] function inorder (node ) if ) node ) in order ) node.lchild ); //左子树inorderARR.push(node.data ); //根inorder(node.rchild ); //右子树}}inorder(tree ) console.log ) inorderarr ); 执行结果:
四、后序遍历1 .算法思路后序遍历是指访问二叉树节点时采用的先左后右再根的方式。
上图所示二叉树后的扫描是GHDBIEFCA
巧用递归,与先后顺序代码只有一个顺序不同:
//树中顺序为in-ordertraversalvoidinorder (node * node ) ) if ) node!=null(inorder(node-left ) ); 节点(node-right ); printf('%d ',node-data ); }2.代码实现//稍后letpostorderarr=[ ] function postorder (node ) if ) node ) postorder ) node.lchild; //左子树postorder(node.rchild ); //右子树postorderARR.push(node.data ); //根}postorder(tree ) console.log ) postorderarr ); 执行结果: