三种遍历
遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
前序遍历:abdefgc
中序遍历:debgfac
后序遍历:edgfbca
递归实现:
前序递归实现:
void preorder(bintree t){ if(t){ printf("%c ",t->data); preorder(t->lchild); preorder(t->rchild); } }中序和后序遍历只是把打印的位置改变下。
非递归实现
非递归算法参考:http://blog.csdn.net/zhangxiangdavaid/article/details/37115355
中序:
//中序遍历 void InOrderWithoutRecursion2(BTNode* root) { //空树 if (root == NULL) return; //树非空 BTNode* p = root; stack<BTNode*> s; while (!s.empty() || p) { if (p) { s.push(p); p = p->lchild; } else { p = s.top(); s.pop(); cout << setw(4) << p->data; p = p->rchild; } } }
前序:
//前序遍历 void PreOrderWithoutRecursion2(BTNode* root) { if (root == NULL) return; BTNode* p = root; stack<BTNode*> s; while (!s.empty() || p) { if (p) { cout << setw(4) << p->data; s.push(p); p = p->lchild; } else { p = s.top(); s.pop(); p = p->rchild; } } cout << endl; }
查找、统计个数、比较、求深度的递归实现
参考:http://blog.csdn.net/fansongy/article/details/6798278/