树的遍历:
1,前序遍历
void PreOrderTraversal(BinTree T){ BinTree T_temp = T; stack<TreeNode*> sta; while(T_temp || !sta.empty()){ while(T_temp){ Print_elm(T_temp->Data); sta.push(T_temp); T_temp=T_temp->left; } if(!sta.empty()){ T_temp=sta.top(); sta.pop(); T_temp=T_temp->right; } } }
2,中序遍历
非递归代码实现如下:
void InOrderTraversal(BinTree T){ BinTree T_temp = T; stack<TreeNode*> sta; while(T_temp || !sta.empty()){ while(T_temp){ sta.push(T_temp); T_temp=T_temp->left; } if(!sta.empty()){ T_temp=sta.top(); sta.pop(); Print_elm(T_temp->Data); T_temp=T_temp->right; } } }
3,后序遍历
4,常见问题:
a,求二叉树的叶子结点数目:
void PreOrderTraversal(BinTree T){ BinTree BT = T; while(BT){ if(!BT->left && !BT->right) Print_elm(BT->Data); PreOrderTraversal(BT->left); PreOrderTraversal(BT->right); } }
b,求二叉树的高度:
int PostOrderGetHeight(BinTree BT){ int HL,HR,MaxH; BinTree BT_temp=BT; if(BT_temp){ HL= PostOrderGetHeight(BT_temp->left); HR= PostOrderGetHeight(BT_temp->right); MaxH = (HL > HR) ? HL : HR; return (MaxH + 1); }else return 0; }
5,考研中考点主要有三个:
a) 写出该树的前序遍历,中序遍历,后序遍历结果。
b) 根据已知的遍历序列,写出另外的遍历序列。
c)根据已知的遍历序列还原树的结构:
中序遍历必须知晓,前序或者后序知晓一个就行,否则无法确定树结构。