定义们:
前、中、后序三种遍历就是根结点是先于左右子树遍历还是后于左右子树遍历的问题。
前:根-左子树(根-左子树(根-左子树……-右子树)-右子树)-右子树
中:左子树(左子树(……)-根-右子树(……))-根-右子树
后:左子树(左子树(……)-右子树-根)-右子树-根
前序是:ABD(查看了小a是否为NULL,因为D是当前子树的根结点,之后应该遍历左子树了,左子树为NULL以后查看右子树小b也为NULL)ECFG
中序:(小a为NULL说明左子树遍历完了所以轮到了根节点)D(该右子树的时候发现小b为NULL 可以说右子树遍历完了)BEAFCG
后序:DEBFGCA
数据结构:
typedef struct BtNode // binaryTreeNode{
BtNode *leftchild;
BtNode *rightchild;
ElemType data;
}BtNode, *BinaryTree;
然后是基本的操作们:
1.建树//先建根->左子树->右子树//
void buildBTree(BinaryTree &T)
{
ElemType ch;
cin >> ch;
if (ch == END)
{
T = NULL;
}
else
{
T = (BtNode*)malloc(sizeof(BtNode));
//需要一个申请内存失败的判断
buildBTree(T->leftchild);
buildBTree(T->rightchild);
}
}
void NicePastOrder(BinaryTree T)//非递归的前序遍历
{
BtNode *ptr = T;
stack<BtNode*> st; // 保存之后去右边的路径
while (ptr != NULL || !st.empty())
{
while (ptr != NULL)
{
cout << ptr->data;
st.push(ptr);
ptr = ptr->leftchild;
}
ptr = st.top();
st.pop();
ptr = ptr->rightchild;
}
}