二叉树遍历,先序中序二叉树构造,BFS,完全二叉树构造
来源:互联网 发布:pk10北京赛车开奖源码 编辑:程序博客网 时间:2024/06/01 19:56
1.二叉树的遍历
遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
下面是代码
void BinaryTree::preOrder(void (*visite)(BinaryTree::Node*), Node* t) { if (t) { visite(t); preOrder(visite, t->left); preOrder(visite, t->right); }}void BinaryTree::inOrder(void (*visite)(BinaryTree::Node*), Node* t) { if (t) { inOrder(visite, t->left); visite(t); inOrder(visite, t->right); }}void BinaryTree::postOrder(void (*visite)(BinaryTree::Node*), Node* t) { if (t) { postOrder(visite, t->left); postOrder(visite, t->right); visite(t); }}
2. 先序中序二叉树构造
BinaryTree::Node* creatTree(std::vector<char>::iterator preOrder, std::vector<char>::iterator inOrder, int n) { std::vector<char>::iterator p1, p2; int i; if (n <= 0) { return NULL; } BinaryTree::Node* root = NULL; root = new BinaryTree::Node(*preOrder, NULL, NULL); i = 0; std::vector<char>::iterator temp = inOrder; while (i < n) { if (*preOrder == *temp) break; ++temp; ++i; } p1 = (preOrder + 1); p2 = inOrder; root->left = creatTree(p1, p2, i); p1 = (preOrder + i + 1); p2 = (inOrder + i + 1); root->right = creatTree(p1, p2, n - i - 1); return root;}// created by preorder and inorderBinaryTree::BinaryTree(const std::vector<char>& preOrder, const std::vector<char>& inOrder) { if (!preOrder.empty() && !inOrder.empty()) { std::vector<char> copy1(preOrder); std::vector<char> copy2(inOrder); std::vector<char>::iterator p1 = copy1.begin(); std::vector<char>::iterator p2 = copy2.begin(); int n = preOrder.size(); root = creatTree(p1, p2, n); } else { root = NULL; }}
BFS
具体看下面完全二叉树代码
bfs构造完全二叉树
BinaryTree::BinaryTree(std::vector<char> & Vec) { int i = 0; if (!Vec.empty()) { std::queue<BinaryTree::Node**> q; while (!q.empty()) q.pop(); q.push(&root); while (!q.empty()) { if (Vec[i] != EMPTY_ELE) { *q.front() = new Node(Vec[i], NULL, NULL); q.push(&(*q.front())->left); q.push(&(*q.front())->right); } i++; q.pop(); } } else { root = NULL; }}
最后是完整作业代码
main.cpp
#include <iostream>#include "BinaryTree.hpp"using namespace std;void print(BinaryTree::Node * temp) { cout << temp->val << " ";}std::vector<char> pre;std::vector<char> in;void getPreOrder(BinaryTree::Node * temp) { pre.push_back(temp->val);}void getInOrder(BinaryTree::Node * temp) { in.push_back(temp->val);}void testTree() { cout << "test Tree" << endl; int n = 1; std::vector<char> tree; cin >> n; while (n--) { char temp = '\0'; cin >> temp; tree.push_back(temp); } BinaryTree x = BinaryTree(tree); BinaryTree::preOrder(print, x.getRoot()); cout << endl; BinaryTree::inOrder(print, x.getRoot()); cout << endl; BinaryTree::postOrder(print, x.getRoot()); cout << endl; BinaryTree::preOrder(getPreOrder, x.getRoot()); BinaryTree::inOrder(getInOrder, x.getRoot()); BinaryTree t = BinaryTree(pre, in); BinaryTree::postOrder(print, t.getRoot()); cout << endl; BinaryTree y = BinaryTree(t); BinaryTree::preOrder(print, y.getRoot()); cout << endl; BinaryTree::inOrder(print, y.getRoot()); cout << endl; BinaryTree::postOrder(print, y.getRoot()); BinaryTree::preOrder(getPreOrder, y.getRoot()); BinaryTree::inOrder(getInOrder, y.getRoot());}int main() { testTree();}
BinaryTree.hpp
#ifndef BinaryTree_hpp#define BinaryTree_hpp#include <iostream>#include <vector>#include <queue>#include <stack>#define EMPTY_ELE '#'class BinaryTree {public: struct Node { char val; Node* left; Node* right; Node(char v, Node* l = NULL, Node* r = NULL): val(v), left(l), right(r) { } }; BinaryTree(const BinaryTree&); BinaryTree(std::vector<char>&); // created by preorder and inorder BinaryTree(const std::vector<char>& preOrder, const std::vector<char>& inOrder); ~BinaryTree(); Node* getRoot() const; void clear(); static void preOrder(void (*visite)(BinaryTree::Node*), Node*); static void inOrder(void (*visite)(BinaryTree::Node*), Node*); static void postOrder(void (*visite)(BinaryTree::Node*), Node*);private: Node * copyNode(Node * oldNode, Node * newNode); Node * root;};#endif /* BinaryTree_hpp */
BinaryTree.cpp
#include "BinaryTree.hpp"#include <queue>#include <iterator>BinaryTree::BinaryTree(const BinaryTree& othBT) { root = NULL; root = copyNode(othBT.getRoot(), root);}BinaryTree::BinaryTree(std::vector<char> & Vec) { int i = 0; if (!Vec.empty()) { std::queue<BinaryTree::Node**> q; while (!q.empty()) q.pop(); q.push(&root); while (!q.empty()) { if (Vec[i] != EMPTY_ELE) { *q.front() = new Node(Vec[i], NULL, NULL); q.push(&(*q.front())->left); q.push(&(*q.front())->right); } i++; q.pop(); } } else { root = NULL; }}BinaryTree::Node* creatTree(std::vector<char>::iterator preOrder, std::vector<char>::iterator inOrder, int n) { std::vector<char>::iterator p1, p2; int i; if (n <= 0) { return NULL; } BinaryTree::Node* root = NULL; root = new BinaryTree::Node(*preOrder, NULL, NULL); i = 0; std::vector<char>::iterator temp = inOrder; while (i < n) { if (*preOrder == *temp) break; ++temp; ++i; } p1 = (preOrder + 1); p2 = inOrder; root->left = creatTree(p1, p2, i); p1 = (preOrder + i + 1); p2 = (inOrder + i + 1); root->right = creatTree(p1, p2, n - i - 1); return root;}// created by preorder and inorderBinaryTree::BinaryTree(const std::vector<char>& preOrder, const std::vector<char>& inOrder) { if (!preOrder.empty() && !inOrder.empty()) { std::vector<char> copy1(preOrder); std::vector<char> copy2(inOrder); std::vector<char>::iterator p1 = copy1.begin(); std::vector<char>::iterator p2 = copy2.begin(); int n = preOrder.size(); root = creatTree(p1, p2, n); } else { root = NULL; }}BinaryTree::~BinaryTree() { if (root != NULL) { clear(); }}BinaryTree::Node* BinaryTree::getRoot() const { return root;}void BinaryTree::clear() { if (root != NULL) { std::queue<Node**> q; while (!q.empty()) q.pop(); if (root != NULL) { Node *p[1000]; int i = 0; q.push(&root); while (!q.empty()) { if (*q.front() != NULL) { if ((*q.front())->left) q.push(&(*q.front())->left); if ((*q.front())->right) q.push(&(*q.front())->right); } if (*q.front() != NULL) { p[i++] = *q.front(); q.pop(); } else { q.pop(); } } for (int j = 0; j < i; j++) { delete p[j]; } } }}void BinaryTree::preOrder(void (*visite)(BinaryTree::Node*), Node* t) { if (t) { visite(t); preOrder(visite, t->left); preOrder(visite, t->right); }}void BinaryTree::inOrder(void (*visite)(BinaryTree::Node*), Node* t) { if (t) { inOrder(visite, t->left); visite(t); inOrder(visite, t->right); }}void BinaryTree::postOrder(void (*visite)(BinaryTree::Node*), Node* t) { if (t) { postOrder(visite, t->left); postOrder(visite, t->right); visite(t); }}BinaryTree::Node * BinaryTree::copyNode(Node * oldNode, Node * newNode) { if (oldNode != NULL) { newNode = new Node(oldNode->val); newNode->left = copyNode(oldNode->left, newNode->left); newNode->right = copyNode(oldNode->right, newNode->right); } return newNode;}
0 0
- 二叉树遍历,先序中序二叉树构造,BFS,完全二叉树构造
- 遍历构造二叉树
- 完全二叉树的构造与遍历
- 二叉树--根据遍历构造二叉树
- 二叉树的构造 遍历
- 二叉树构造与遍历
- 二叉树 --- 树的构造和遍历
- 二叉树构造:二叉树的广度优先遍历
- 由遍历序列构造二叉树
- 排序二叉树的构造与遍历
- 根据遍历结果构造二叉树
- 二叉树的构造与遍历
- 根据遍历结果,构造二叉树
- 二叉查找树的构造及其遍历
- 二叉树的构造和遍历
- 由遍历序列构造二叉树
- 二叉树实现(构造,遍历)-java
- 二叉树的构造及遍历
- APP界面设计之页面布局的22条基本原则
- 广播接收者,IP拨号器,简单的描述
- 获取SQLSERVER的IP地址
- iOS runtime的理解
- 返回activity时传递数据
- 二叉树遍历,先序中序二叉树构造,BFS,完全二叉树构造
- 显示和隐式跳转
- PHP获取URL
- C语言学习(2)-getchar(), _getche()和_getch()
- 数据传递intent,Bundle
- 手势(UIGestureXXX)使用详解
- 经典算法<二>约瑟夫问题 C++实现
- 【BZOJ4429】[Nwerc2015] Elementary Math小学数学【二分图匹配】
- 创建第二个activity