树的遍历有3种:先根遍历、中根遍历、后根遍历;
先根遍历:如果该二叉树为空树,则空操作,否则先访问根结点,再先根遍历左子树,最后先根遍历右子树。
1 //该二叉树用二叉链表存储,结点类型BiTreeNode 2 void pre_oder(BiTreeNode *root){ 3 if(root!=NULL){ 4 cout << root->data;//访问结点(这里是输出结点信息) 5 pre_oder(root->leftchild);//先根遍历左子树 6 pre_oder(root->rightchild);//先根遍历右子树 7 } 8 }
中根遍历:如果该二叉树为空树,则空操作,否则先中根遍历左子树,再访问根结点,最后中根遍历右子树。
//该二叉树用二叉链表存储,结点类型BiTreeNode void in_oder(BiTreeNode *root){ if(root!=NULL){ in_oder(root->leftchild);//中根遍历左子树 cout << root->data;//访问结点(这里是输出结点信息) in_oder(root->rightchild);//中根遍历右子树 } }
后根遍历:如果该二叉树为空树,则空操作,否则先后根遍历左子树,再后根遍历右子树,最后访问根结点。
1 //该二叉树用二叉链表存储,结点类型BiTreeNode 2 void back_oder(BiTreeNode *root){ 3 if(root!=NULL){ 4 back_oder(root->leftchild);//后根遍历左子树 5 back_oder(root->rightchild);//后根遍历右子树 6 cout << root->data;//访问结点(这里是输出结点信息) 7 } 8 }
如果把cout << root->data语句抹去,这三种算法是完全相同的,只是访问结点的时机不同。
每次访问某子树时,都要先经过子树的根,访问完该子树的左子树后又会路过该子树的根,访问完右子树后还会路过根。所以每个节点都会被路过三次。
如果在第一次路过时访问,就是先根遍历,如果是第二次,就是中根遍历,最后一次则是后根遍历。