树的递归和非递归遍历
利用循环和栈实现前序、中序和后序遍历、利用队列实现层次遍历 typedef struct node { int data; int cnt;//在后序遍历中使用,子树的根节点在第一次遍历的时候不会输出,只有在第二次遍历的时候才输出。 struct node *lchild; struct node *rchild; }bitree; stack<node*> s; 前序遍历 //针对一个根结点,先输出其根结点值,再push其所有左结点,然后再弹出一个结点取其右结点作为新的根结点。 void preorder(bitree *t)//前序遍历的非递归算法 { bitree *temp = t; while(temp != NULL || !s.empty()) { //遍历所有左结点 while(temp != NULL)//先遍历左孩子,并输出。 { printf("%4d",temp->data); s.push(temp); temp = temp->lchild; } if(!s.empty())//当左孩子遍历完后,取栈顶,找右孩子。此时循环还没有结束,再遍历它的左孩子,直至孩子全部遍历结束。 { temp = s.top(); s.pop(); temp = temp->rchild; } } printf("\n"); } 中序遍历 void inorder