二叉树的遍历

来源:互联网 发布:淘宝售后人工客服电话 编辑:程序博客网 时间:2024/06/05 11:01

树:


1、前序遍历:根节点+左子树+右子树

(1)递归

void _PreOrder(pNode& root)//递归前序遍历(根节点+左子树+右子树){if (root){cout << root->_data << " ";_PreOrder(root->_pleft);_PreOrder(root->_pright);}}

(2)非递归

void _PreOrder(pNode root)//非递归前序遍历(根节点+左子树+右子树){if(root == NULL)return;stack<pNode> s;pNode cur = root;while(!s.empty()||cur){while (cur){s.push(cur);cout << cur->_data << " ";cur = cur->_pleft;}pNode top = s.top();s.pop();cur = top->_pright;}cout<<endl;}

2、中序遍历:左子树+根节点+右子树

(1)递归

void _InOrder(pNode& root)//递归中序遍历(左子树+根节点+右子树){if (root){_InOrder(root->_pleft);cout << root->_data << " ";_InOrder(root->_pright);}}
(2)非递归
void _InOrder(pNode& root)//非递归中序遍历(左子树+根节点+右子树){if (root == NULL)return;stack<pNode> s;pNode cur = root;while (!s.empty() || cur){while (cur){s.push(cur);cur = cur->_pleft;}if (!s.empty()){cur = s.top();s.pop();cout << cur->_data << " ";cur = cur->_pright;}}cout << endl;}

3、后序遍历:左子树+右子树+根节点

(1)递归

void _PostOrder(pNode& root)//递归后序遍历(左子树+右子树+根节点){if (root){_PostOrder(root->_pleft);_PostOrder(root->_pright);cout << root->_data << " ";}}

(2)非递归

void _PostOrder(pNode& root)//非递归后序遍历(左子树+右子树+根节点){if (root == NULL)return;stack<pNode> s;pNode cur = root;pNode last = NULL;while ( cur){s.push(cur);cur = cur->_pleft;}while(!s.empty()){cur = s.top();s.pop();if (cur->_pright == NULL || cur->_pright == last){cout << cur->_data << " ";last = cur;}else{s.push(cur);cur = cur->_pright;while (cur){s.push(cur);cur = cur->_pleft;}}}cout << endl;}
4、层序遍历:

层序遍历的算法:

(1)初始化一个队列

(2)把根节点的指针入队列

(3)当队列非空时,循环执行以下步骤:

>>出队列取一个节点

>>若该队列的左子树为空,将左子树的指针入队列

>>若该队列的右子树为空,将右子树的指针入队列

void _LevelOrder(pNode& root)//层次遍历{queue<pNode> q;if (root)q.push(root);while (!q.empty()){pNode pCur = q.front();q.pop();cout << pCur->_data << " ";if (pCur->_pleft)q.push(pCur->_pleft);if (pCur->_pright)q.push(pCur->_pright);}cout << endl;}
运行结果:




原创粉丝点击