BST 遍历
来源:互联网 发布:centos 7 乱码 编辑:程序博客网 时间:2024/05/19 02:44
递归遍历
pre_order
// 递归先序遍历 void rpre_order(btree* tree) { btNode * p = tree; if (NULL == p) { return; } cout << p->data << " "; rpre_order(p->left); rpre_order(p->right); }
pos_order
// 递归后续遍历 void rpost_order(btree* tree) { btNode* p = tree; if (NULL == p) return; rpost_order(p->left); rpost_order(p->right); cout << p->data << " "; }
in_order
// 递归中序遍历 void rin_order(btree* tree) { btNode* p = tree; if (NULL == p) return; rin_order(p->left); cout << p->data << " "; rin_order(p->right); }
非递归遍历
pre
// 非递归前序遍历 void pre_order(btree* tree) { btNode * p = tree; if (NULL == p) return; stack<btNode*>* st = new stack<btNode*>(); st->push(p); while (!st->empty()) { p = st->top(); st->pop(); cout << p->data << " "; if (NULL != p->right) { st->push(p->right); } if (NULL != p->left) { st->push(p->left); } } delete st; }
pos
// 非递归后续遍历 //需要注意的是 : 非递归<strong>后序</strong>遍历方法相对实现比较困难,主要原因就在于父子节点访问缺乏连续 // 解决思路是将前一个访问节点记忆下来,并判断和当前节点之间的关系再做处理 void post_order(btree* tree) { btNode* curr = tree; // 记录当前执行的节点 btNode* prev = NULL; // 记录前一个访问的节点 if (NULL == curr) { return; } stack<btNode*>* st = new stack<btNode*>(); st->push(curr); while (!st->empty()) { curr = st->top(); // 如果该节点没有孩子节点则可以直接访问 if (NULL == curr->left && NULL == curr->right) { cout << curr->data << " "; st->pop(); prev = curr; continue; } // 如果该节点的孩子节点已经被访问过了,也可直接访问 if (NULL != prev && (prev == curr->right || prev == curr->left)) { cout << curr->data << " "; st->pop(); prev = curr; continue; } // 除了上述情况则需要将孩子节点入栈 if (NULL != curr->right) { st->push(curr->right); } if (NULL != curr->left) { st->push(curr->left); } } delete st; }
in
// 非递归中序遍历 void in_order(btree* tree) { btNode* p = tree; if (NULL == p) return; stack<btNode*>* st = new stack<btNode*>(); while (NULL != p || !st->empty()) { while (NULL != p) { st->push(p); p = p->left; } if (!st->empty()) { p = st->top(); st->pop(); cout << p->data << " "; p = p->right; } } delete st; }
逐层遍历
广度优先
void bfs_order(btree* tree) { btNode* p = tree; if (NULL == p) { return; } queue<btNode*> * qu = new queue<btNode*>(); qu->push(p); while (!qu->empty()) { p = qu->front(); qu->pop(); cout << p->data << " "; if (NULL != p->left) { qu->push(p->left); } if (NULL != p->right) { qu->push(p->right); } } delete qu; }
销毁二叉树
void destory_btree(btree* tree) { btNode* p = tree; if (NULL == p) { return; } queue<btNode*> * qu = new queue<btNode*>(); qu->push(p); while (!qu->empty()) { p = qu->front(); qu->pop(); if (NULL != p->left) { qu->push(p->left); } if (NULL != p->right) { qu->push(p->right); } free(p); } delete qu; }
0 0
- BST 遍历
- BST的后续遍历
- BST 插入删除查找遍历
- BST的后序遍历
- 1115. Counting Nodes in a BST (30)[bst+dfs遍历]
- BST(二叉搜索树)按层遍历
- 从前序遍历序列恢复BST
- BST的生成和遍历PAT1043
- bst三种遍历及其他
- BST 树的建立于遍历
- 非递归地中序遍历BST
- BST中序遍历(Iterative)
- Morris Traversal算法遍历BST c实现
- HDU 3999 BST + 先序遍历
- BST
- BST
- BST
- BST
- 【Bzoj3668】起床困难综合症
- 网络信息服务 (NIS/YP)
- Java开发环境搭建
- Javascript中的windows窗口对象
- Spark源码系列(一)spark-submit提交作业过程
- BST 遍历
- string的使用uva-1593 代码对齐
- BaseActivity:统一编写共有逻辑
- Java多线程干货系列—(四)volatile关键字
- Spark源码系列(二)RDD详解
- bugs——node version already installed
- 模拟实现list(迭代器)
- 单表查询
- 本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效