void LayerOrder(BTreeNode *t){
//利用队列实现层次遍历,每次访问根结点,然后一次放入左结点和右结点(如果有的话)。
if(t == NULL)return ;
queue<BTreeNode*> q;
BTreeNode *temp;
q.push(t);
while(!q.empty()){
temp = q.front();
q.pop();
cout<<temp->data<<' ';
if(temp->lchild != NULL)q.push(temp->lchild);
if(temp->rchild != NULL)q.push(temp->rchild);
}
}
层次遍历,需要额外O(N)的空间队列临时存储。
void morris_inorder(BiTree T) {
BNode *p, *temp;
p = T;
while(p) {
if(p->left == NULL) {
printf("%4c", p->ch);
p = p->right;
} else {
temp = p->left;
//找到左子树的最右子节点
while(temp->right != NULL && temp->right != p) {
temp = temp->right;
}
if(temp->right == NULL) {
temp->right = p;
p = p->left;
} else {
printf("%4c", p->ch);
temp->right = NULL;
p = p->right;
}
}
}
}
Morris中序遍历,只需要两个临时节点空间
void inOrder_traverse_recur(BiTree T) {
if(T == NULL) {
return;
} else {
inOrder_traverse_recur(T->left);
printf("%4c", T->ch);
inOrder_traverse_recur(T->right);
}
}
递归中序遍历,需要栈空间