c++ 先序构建二叉树

二叉树首先要解决构建问题,才能考虑后续的遍历,这里贴出通过先序构建二叉树,同时包含四种二叉树的遍历方法(先序,中序,后序,逐层)

第一、定义BinaryTreeNode 类

 1 #include <iostream>
 2 #include <string>
 3 #include <queue>
 4 using namespace std;
 5
 6 template<typename T >class BinaryTree;
 7 template <typename T> class BinaryTreeNode {
 8 public:
 9     friend class BinaryTree<T>;
10     BinaryTreeNode() {
11         data = NULL;
12         lChild = rChild = NULL;
13     }
14     BinaryTreeNode(T newdata) {
15         this->data = newdata;
16         lChild = rChild = NULL;
17     }
18     T getData() {
19         return data;
20     }
21     BinaryTreeNode<T> * getLeftNode() {
22         return lChild;
23     }
24     BinaryTreeNode<T> * getRightNode() {
25         return rChild;
26     }
27     T data;
28     BinaryTreeNode<T>* lChild;
29     BinaryTreeNode<T>* rChild;
30 private:
31
32 };

第二、定义BinaryTree 类

  1 template <typename T> class BinaryTree {
  2 public:
  3     BinaryTreeNode<T> *root;
  4     char* p;
  5     BinaryTree() { root = NULL; }
  6     BinaryTree(T data) {
  7         root = new BinaryTreeNode<T>(data);
  8         root->lChild = NULL;
  9         root->rChild = NULL;
 10     }
 11     ~BinaryTree() {
 12         delete root;
 13     }
 14
 15     //构建二叉树并返回
 16     BinaryTreeNode<T>* CreateTree() {
 17         BinaryTreeNode<int>* bt = NULL;
 18         char t;
 19         cin >> t;
 20         if (t == ‘#‘)
 21         {
 22             return NULL;
 23         }
 24         else {
 25             int num = t - ‘0‘;
 26             bt = new BinaryTreeNode<T>(num);
 27             bt->lChild = CreateTree();
 28             bt->rChild = CreateTree();
 29         }
 30         return bt;
 31     }
 32
 33     //先序构建二叉树
 34     BinaryTreeNode<T>* PreCreateTree() {
 35         BinaryTreeNode<int>* bt = NULL;
 36         if (this->root == NULL)
 37         {
 38             cout << "请输入根节点(#代表空树):";
 39         }
 40         else {
 41             cout << "请输入节点(#代表空树):";
 42         }
 43         char t;
 44         cin >> t;
 45         if (t == ‘#‘)
 46         {
 47             return NULL;
 48         }
 49         else {
 50             int num = t - ‘0‘;
 51             bt = new BinaryTreeNode<T>(num);
 52             if (this->root == NULL)
 53             {
 54                 this->root = bt;
 55             }
 56             cout << bt->data << "的左孩子";
 57             bt->lChild = PreCreateTree();
 58
 59             cout << bt->data << "的右边孩子";
 60             bt->rChild = PreCreateTree();
 61         }
 62         return bt;
 63     }
 64
 65     void preOderTraversal(BinaryTreeNode<T> *bt);  //先序遍历
 66     void inOrderTraversal(BinaryTreeNode<T> *bt);  //中序遍历
 67     void postOrderTraversal(BinaryTreeNode<T> *bt);//后序遍历
 68     void levelTraversal(BinaryTreeNode<T> *bt);    //逐层遍历
 69
 70 private:
 71
 72 };
 73
 74 template <typename T>
 75 void BinaryTree<T>::preOderTraversal(BinaryTreeNode<T> *bt) {
 76     if (bt)
 77     {
 78         cout << bt->data;
 79         BinaryTree<T>::preOderTraversal(bt->getLeftNode());
 80         BinaryTree<T>::preOderTraversal(bt->getRightNode());
 81     }
 82 }
 83
 84 template <typename T>
 85 void BinaryTree<T>::inOrderTraversal(BinaryTreeNode<T> *bt) {
 86     if (bt)
 87     {
 88         BinaryTree<T>::inOrderTraversal(bt->getLeftNode());
 89         cout << bt->data;
 90         BinaryTree<T>::inOrderTraversal(bt->getRightNode());
 91     }
 92 }
 93
 94 template <typename T>
 95 void BinaryTree<T>::postOrderTraversal(BinaryTreeNode<T> *bt) {
 96     if (bt)
 97     {
 98         BinaryTree<T>::postOrderTraversal(bt->getLeftNode());
 99         BinaryTree<T>::postOrderTraversal(bt->getRightNode());
100         cout << bt->data;
101     }
102 }
103
104 template <typename T>
105 void BinaryTree<T>::levelTraversal(BinaryTreeNode<T> *bt) {
106
107     queue<BinaryTreeNode<T>*> que;
108     que.push(bt);
109     while (!que.empty())
110     {
111         BinaryTreeNode<T>* proot = que.front();
112         que.pop();
113         cout << proot->data;
114
115         if (proot->lChild != NULL)
116         {
117             que.push(proot->lChild);//左孩子入队
118         }
119         if (proot->rChild != NULL)
120         {
121             que.push(proot->rChild);//右孩子入队
122         }
123     }
124 }

第三、主程序运行

 1 #include "pch.h"
 2 #include <iostream>
 3 #include "BinaryTree.h"
 4
 5 int main()
 6 {
 7     //场景测试2
 8     BinaryTree<int> btree;
 9     btree.PreCreateTree();//先序构建二叉树
10     cout << "先序遍历:";
11     btree.preOderTraversal(btree.root); cout << endl;//先序遍历
12     cout << "中序遍历:";
13     btree.inOrderTraversal(btree.root); cout << endl;//中序遍历
14     cout << "后序遍历:";
15     btree.postOrderTraversal(btree.root); cout << endl;//后序遍历
16     cout << "逐层序遍历:";
17     btree.levelTraversal(btree.root);
18
19 }

最终测试运行截图

原文地址:https://www.cnblogs.com/clc2008/p/10187565.html

时间: 2024-11-14 09:41:26

c++ 先序构建二叉树的相关文章

Leetcode:Construct Binary Tree 前序和中序、后序和中序构建二叉树

前序和中序构建二叉树 后序和中序构建二叉树 分析:主要思路就是 在中序中找根节点然后划分左右子树,具体如下: 1. 查找根节点. 我们知道前序序列的第一个元素 和 后序序列的最后一个元素 肯定是根节点,我们就以此为突破口 2. 确定根节点的坐标. 我们在 中序序列中找到 根节点 的下标. 3. 分割左右子树. 对于中序序列:根节点下标之前的都属于左子树,之后的都属于右子树 对于先序序列:根节点之后的 一段元素(该段长度可以由中序序列的左子树长度确定)属于左子树,左子树之后的元素属于右子树 对于先

(树)根据中序后序构建二叉树

题目:根据中序和后序遍历构建二叉树 思路:利用递归加上分治的思想.先找到根节点的值,然后在根据中序遍历找到根节点的左右两边的值,然后在递归的处理左右两边的左右子树.这里的关键在于怎么处理递归的左右子树的范围,代码里面详细解释 代码: class Solution { public: TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { vector<int>::size_t

题目:1385 由前序和中序构建二叉树

http://ac.jobdu.com/problem.php?pid=1385 蛮怀旧的题目,记得大一就见过一直没做过,没难度,纯小心吧. 类似的是有中序和后续构建二叉树.比如http://www.cnblogs.com/kaituorensheng/p/3788533.html 思路很简单 递归构造: #include <cstdio> #include <cstring> #include <iostream> #include <cstdio> #i

根据先序和中序构建二叉树(java)后序输出

先序序列:   1,2,4,8,5,3,6,7 中序序列:   8,4,2,5,1,6,3,7 //节点类 /** * */ package Tree; /** * @author 邢兵 * @data * @description */ public class Node { public Object data; public Node left; public Node right; //创建一个空节点 public Node(){ this(null); } //创建一个没有孩子的节点

前序中序构建二叉树

public Node PreMidToTree(int[] pre,int[] mid) { if (pre == null || mid == null) return; Dictionary<int, int> dic = new Dictionary<int, int>(); for (int i = 0; i < mid.Length; i++) dic[mid[i]] = i; return PreMid(pre, 0, pre.Length - 1, mid,

剑指offer (6) 二叉树构建 二叉树遍历

前序和中序构建二叉树 后序和中序构建二叉树 二叉树遍历大总结: 先序.中序.后序 .层次 (递归.非递归.Morris)

根据先序和中序序列构建二叉树

说明: 本次实验利用中序和先序序列,采用递归方式来构建二叉树 . 经过几天的失败和思考,我认为递归构建二叉树的过程中最重要的是递归单元,最麻烦的是递归参数的选择和传递. 简单将算法过程用如下流程图来表示:(本帖所用算法及图片均为原创内容,转贴注明出处) 算法:1.根据先序序列,建立根结点T 2.寻找中序序列的根结点位置,并据此位置计算左子树和右子树的区间 3.判断l_start和r_end是否相等,相等则表示只有一个根结点,设置其左右孩子结点为空并结束这一层:若不相等则继续下面步骤: 4.根据2

先序遍历和后序遍历构建二叉树

递归的方法利用先序遍历和中序遍历构建二叉树,同样也可以利用到中序遍历和后序遍历构建二叉树. //利用先序遍历和中序遍历构建二叉树 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { TreeNode *root=NULL; if(preorder.size()==0||inorder.size()==0||preorder.size()!=inorder.size()) return

【LeetCode每天一题】Construct Binary Tree from Preorder and Inorder Traversal(使用前序和中序遍历构建二叉树)

Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. For example, given preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] Return the following binary tree: 3 / 9 20 /