二叉树基本操作实现(二叉树的链式存储)

 

  1 #include <iostream>
  2 using namespace std;
  3 typedef struct bintree_node  
  4 {
  5     int data;
  6     bintree_node *lchild;
  7     bintree_node *rchild;
  8 }bintree_node;
  9 
 10 typedef struct stack
 11 {
 12     bintree_node *data[100];
 13     int tag[100];//为栈中每个元素设置标记,用于后序遍历
 14     int top;
 15 }seqstack;
 16 
 17 void push(seqstack *s, bintree_node *p)
 18 {
 19     s->data[++s->top] = p;
 20 }
 21 
 22 bintree_node *pop(seqstack *s)
 23 {
 24     if(s->top != -1)
 25     {
 26         s->top--;
 27         return (s->data[s->top + 1]);
 28     }
 29     else
 30         return NULL;
 31 }
 32 
 33 bintree_node *bintree_create()
 34 {
 35     bintree_node *p = (bintree_node *)malloc(sizeof(bintree_node));
 36     if(NULL == p)
 37     {
 38         cout << "alloc memory error!!!" << endl;
 39         return NULL;
 40     }
 41     cin >> (p->data);
 42     if(p->data == -1)
 43     {
 44         return NULL;
 45     }
 46     p->lchild = bintree_create();
 47     p->rchild = bintree_create();
 48     return p;
 49 }
 50 
 51 void prebintree(bintree_node *p)//前序遍历递归实现
 52 {
 53     if(p)
 54     {
 55         cout << p->data << "\t";
 56         prebintree(p->lchild);
 57         prebintree(p->rchild);
 58     }
 59 }
 60 void prebintree1(bintree_node *p)//前序遍历非递归实现
 61 {
 62     seqstack s;
 63     s.top = -1;
 64     while ((p) || (s.top != -1))
 65     {
 66         while (p)
 67         {
 68             cout << p->data << "\t";
 69             s.top++;
 70             s.data[s.top] = p;
 71             p = p->lchild;
 72         }
 73         if(s.top > -1)
 74         {
 75             p = pop(&s);
 76             p = p->rchild;
 77         }
 78     }
 79 }
 80 void levelTraverse(bintree_node *p)
 81 {
 82     bintree_node *queue[20];              
 83     bintree_node *tmp;
 84     int front = 0, rear = 0;//表示队头指针和队尾指针
 85     if(p)
 86     {
 87         tmp = p;//根指针入队
 88         queue[rear] = tmp;
 89         rear = (rear + 1)%20;//队尾指针加一对20取余,可实现循环队列,合理利用空间
 90         while(front != rear)//队不空
 91         {
 92             tmp = queue[front];//出队,将值赋给tmp
 93             cout << tmp->data;
 94             front = (front + 1)%20;
 95             if(tmp -> lchild)//如果tmp有左子树,将左子树入队
 96             {
 97                 queue[rear] = tmp->lchild;
 98                 rear = (rear + 1)%20;
 99             }
100             if(tmp->rchild)//如果tmp有右子树,将右子树入队
101             {
102                 queue[rear] = tmp->rchild;
103                 rear = (rear + 1)%20;
104             }
105         }
106     }
107 }
108 int main()
109 {
110     bintree_node *p = bintree_create();
111     prebintree1(p);
112     levelTraverse(p);
113     cout << endl;
114     return 0;
115 }

转载于:https://www.cnblogs.com/sinaxyz/archive/2012/08/25/2656708.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种非常重要的数据结构,它可以用链式存储和顺序存储两种方式实现链式存储是指用指针来表示二叉树的结构,而顺序存储则是用数组来表示二叉树的结构。在C语言中,我们通常使用链式存储实现二叉树二叉树基本操作包括建立、遍历、计算深度、结点数、叶子数等。其中,建立二叉树可以使用前序遍历或中序遍历或后序遍历的方式实现。下面是用前序遍历的方式来创建二叉树的代码: ``` typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode, *pTreeNode; pTreeNode createTree() { char ch; scanf("%c", &ch); if (ch == '#') { return NULL; } pTreeNode root = (pTreeNode)malloc(sizeof(TreeNode)); root->data = ch; root->left = createTree(); root->right = createTree(); return root; } ``` 遍历二叉树有三种方式:前序遍历、中序遍历和后序遍历。下面是三种遍历方式的代码: ``` void preOrder(pTreeNode root) { if (root == NULL) { return; } printf("%c ", root->data); preOrder(root->left); preOrder(root->right); } void inOrder(pTreeNode root) { if (root == NULL) { return; } inOrder(root->left); printf("%c ", root->data); inOrder(root->right); } void postOrder(pTreeNode root) { if (root == NULL) { return; } postOrder(root->left); postOrder(root->right); printf("%c ", root->data); } ``` 计算二叉树的深度可以使用递归的方式实现。下面是计算二叉树深度的代码: ``` int depth(pTreeNode root) { if (root == NULL) { return 0; } int leftDepth = depth(root->left); int rightDepth = depth(root->right); return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1; } ``` 计算二叉树的结点数和叶子数也可以使用递归的方式实现。下面是计算二叉树结点数和叶子数的代码: ``` int countNodes(pTreeNode root) { if (root == NULL) { return 0; } return countNodes(root->left) + countNodes(root->right) + 1; } int countLeaves(pTreeNode root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { return 1; } return countLeaves(root->left) + countLeaves(root->right); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值