二叉树的遍历算法和解析(java)
。
遍历二叉树
注意:我所说的先序,中序,后序,都是指每一个相对子树根节点位置。
先序遍历(跟节点----左节点-----右节点):
先序遍历是指从根节点开始(root !=null),所对应的每一个子树,都是先遍历跟节点,然后是遍历左子树,然后是右子树
.
根节点存在F写入,然后是F的左子树,对于F的左子树来说C是这个子树的根节点,然后写入C,然后是这个树的左子树为A,A没有孩子,返回跟节点,找跟节点的右节点,为D,D的左节点为B,B没有孩子,一直返回到跟节点F,开始F的右子树,对于右子树来说,根节点为E,E没有左节点,写入右节点G,对于G来说,它又是一棵树的根节点,根节点写入,然后遍历左节点H,然后是右节点P,最后的顺序就是
F C A D B E G H P
先序遍历的算法:
//创建根节点
private TreeNode root;
public Binaryorder{
public Binaryorder (TreeNode root){
this.root = root;
}
public TreeNode getRoot(){
return root;
}
public void setRoor( TreeNode root){
this root = root;
}
递归 前序遍历算法实现(java):
public void preOrder(Treenode node){
if (node !=null)
{
System.out.print(node.getdata()+"");
preOrder (node.getleft());
preOrder(node .getright())
}
}
中序遍历(左节点-------根节点------右节点)
中序遍历是指每一棵树都是先遍历左子树,然后是根节点,最后才是右节点。
仍然是这棵树,根节点为F ,它的左节点为C,以C为根节点,又是一棵树,,C的左子树为A,A没有节点,所以A就是这次中序遍历的第一个数,然后是它的根节点是C,然后C 的右子树,对于右子树来说,它的左节点为B,然后是它的根节点D,然后是F,然后是F的右子树,对于哟字数来说根节点为E,左子树为空所以下一个节点就是E,然后是E的右节点,右节点是一棵树,进行中序遍历,先访问H,然后是 G,,最后是 P 所以最后的顺序是A C B D F E H G P
递归 中序遍历算法实现(java):
public void InOrder (TreeNode node){
if(node !==null{
inOrder(node.getleft());
System.out.print(node.getdata()+" ");
inOrder (node.getright());
}
}
后序遍历(左子树------右子树-----根节点)
后序遍历是指先访问左子树,然后是右子树,最后才是根节点
从根节点F 开始 ,它的左节点C,又是一个以C为根节点的小树,它的左节点为A,所以先输出A,,然后C的右子节点,这是一棵树,先访问左节点B,输出B,没有右节点返回根节点D,然后返回根节点C,对于根节点F来说,它还有右子树,所以无法输出,遍历它的右子树以E为根节点,左子树为空,遍历右节点,右节点以G为根节点是一棵树,左节点为H,右节点为P,所以先输出H,然后是 P,然后返回根节点G,再向上返回根节点E 再是 F,所以后序遍历的顺序是
A B D C H P G E F
递归:后序遍历算法(java)
public void PrintBinaryTreeBacRecur(TreeNode node ){
if(node !=null){
PrintBinaryTreeBacRecur(node.getleft());
PrintBinaryTreeBacRecur(node.getright());
System.out.print(node.getdata()+" ");
}
}