当前位置:   article > 正文

c语言实现数据结构--建立一颗二叉树_创建二叉树c语言

创建二叉树c语言

目录

建立一颗二叉树

二叉树的定义及性质

建立一颗二叉树代码

二叉树的遍历

先序遍历

 非递归

中序遍历

后序遍历

非递归 

层序遍历

递归方法


建立一颗二叉树

二叉树的定义及性质

二叉树的特点是一颗有序树,每个结点的度最大为2。从根结点开始,他的左孩子和右孩子也是一颗树的根结点,也就是这个结点的左子树和右子树

二叉树的分支有左右子树之分,而树的分支无左右子树之分。

两种特殊的二叉树:

满二叉树:深度为h且结点数为2的h次方-1的二叉树,在这种二叉树中,除最后一层全是叶子结点外,其余每一层上的各个结点都有左右孩子。

完全二叉树:深度为h,有n个结点的二叉树,当且仅当每个结点都与深度为h的满二叉树中编号从1到n的结点一一对应。满二叉树是完全二叉树的特殊形式。

完全二叉树具有的特点:

1.所有的叶子节点都在最下面两层,除最后一层外的各层组成的二叉树是一颗满二叉树

2.若某个结点有右孩子,则该结点必有左孩子

性质:

1.二叉树的第i层上的结点个数的最大值为2的i-1次方(i>=1)

2.深度为h的二叉树上的结点个数的最大值为2 的h次方-1,即深度为h的完全二叉树上的结点个数为为2 的h-1次方-1.

3.对任何一颗二叉树,若其终端结点数为n0,度为2的结点数为n2,则n0  = n2 + 1

4.含有n个结点的完全二叉树的深度为[㏒2n]+1

5.具有n个结点的完全二叉树的结点按层次编号(按从上到下。从左到右的方式连续编号),则对任一结点i有:

建立一颗二叉树代码

包括初始化以及销毁

  1. typedef struct Node{
  2. int val;
  3. struct Node *lchild, *rchild;
  4. }Node;
  5. typedef struct tree{
  6. Node *root;
  7. int n;
  8. }Tree;
  9. //初始化结点
  10. Node* GetNewNode(int val){
  11. Node *p = (Node*)malloc(sizeof(Node));
  12. p->val = val;
  13. p->rchild = p->rchild = NULL;
  14. return p;
  15. }
  16. //初始化一个树
  17. Tree*GetNewTree(){
  18. Tree*tree = (Tree*)malloc(sizeof(Tree));
  19. tree->n = 0;
  20. tree->root = NULL;
  21. return tree;
  22. }
  23. Node* insertNode(Node *root, int val){
  24. if(root == NULL)
  25. return GetNewNode(val);
  26. if(root->val == val)
  27. return root;
  28. else if(root->val > val)
  29. root->lchild = insertNode(root->lchild, val);
  30. else
  31. root->rchild = insertNode(root->rchild, val);
  32. return root;
  33. }
  34. //插入一个结点
  35. void insert(Tree*tree, int val){
  36. tree->root = insertNode(tree->root, val);
  37. tree->n++;
  38. return;
  39. }
  40. //销毁
  41. void clearNode(Node* node){
  42. if(node == NULL)
  43. return ;
  44. clearNode(node->lchild);
  45. clearNode(node->rchild);
  46. free(node);
  47. return ;
  48. }
  49. void clearTree(Tree*tree){
  50. clearNode(tree->root);
  51. free(tree);
  52. return;
  53. }

二叉树的遍历

分为前序中序后序遍历,这个前中后都是说的根节点,然后还有层序遍历

先序遍历

先访问根节点,先序遍历左子树,先序遍历右子树

递归方法简单而且好理解,但是对电脑内存栈需求量大

  1. void p1(Node *node){
  2. if(node){
  3. cout << node->val;//先输出跟结点
  4. p1(node->lchild);//遍历左子树
  5. p1(node->rchild);//遍历右子树
  6. }
  7. }

 非递归

  1. //先序遍历的非递归算法利用栈的性质
  2. void p_1(Tree *tree){
  3. Node *ro = tree->root;
  4. if(ro){
  5. stack<Node*>s;
  6. s.push(ro);//根节点入栈
  7. while(!s.empty()){
  8. while(s.top() && ro){//栈顶元素非空
  9. cout << s.top()->val;
  10. ro = ro->lchild;
  11. s.push(ro);
  12. }
  13. s.pop();//空结点出栈
  14. if(!s.empty()){
  15. s.pop();
  16. ro = ro->rchild;
  17. s.push(ro);
  18. }
  19. }
  20. }
  21. return ;
  22. }

二叉树遍历就借用了c++STL里面的一部分

中序遍历

  1. void p1(Node *node){
  2. if(node){
  3. p1(node->lchild);//遍历左子树
  4. cout << node->val;//先输出跟结点
  5. p1(node->rchild);//遍历右子树
  6. }
  7. }

中序遍历的非递归几乎和先序一样,会一个就相当于都会了

后序遍历

  1. void p1(Node *node){
  2. if(node){
  3. p1(node->lchild);//遍历左子树
  4. p1(node->rchild);//遍历右子树
  5. cout << node->val;//先输出跟结点
  6. }
  7. }

非递归 

  1. //后序遍历的非递归算法利用栈的性质
  2. void p_1(Tree *tree){
  3. Node *ro = tree->root;
  4. if(ro){
  5. stack<Node*>s;
  6. s.push(ro);//根节点入栈
  7. while(!s.empty()){
  8. while(s.top() && ro){//遍历左子树
  9. //cout << s.top()->val;
  10. ro = ro->lchild;
  11. s.push(ro);
  12. }
  13. s.pop();//空结点出栈
  14. if(!s.empty()){//遍历右子树+
  15. cout << a.top()->val;
  16. // s.pop();
  17. // ro = ro->rchild;
  18. // s.push(ro);
  19. if(ro->rchild){
  20. s.push(ro->rchild);//右子树根节点入栈
  21. }
  22. else{//左右子树遍历结束,访问根结点
  23. s.pop();
  24. cout << ro->val;
  25. while(!s.top() && s.top() && ro->rchild == ro){
  26. //若访问的结点是其双亲结点的右孩子,则双亲出栈
  27. s.pop();
  28. cout << ro->val;
  29. }
  30. if(s.empty()){//使栈顶结点的右孩子入栈
  31. s.push(ro->rchild);
  32. }
  33. }
  34. }
  35. }
  36. }
  37. return ;
  38. }

层序遍历

递归方法

  1. void level(Node *node){
  2. Node *p = node;
  3. queue<Node*> q;
  4. q.push(p);
  5. while(!q.empty()){
  6. q.pop();
  7. cout << p->val;
  8. if(p->lchild)
  9. q.push(p->lchild);
  10. if(p->rchild)
  11. q.push(p->rchild);
  12. }
  13. return;
  14. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/233113
推荐阅读
相关标签
  

闽ICP备14008679号