[NOIp]二叉树的指针实现

今天学到了二叉树,一开始被那个malloc弄的很迷,后来发现root=(BiTreeNode*)malloc(sizeof(BiTreeNode))的那个星号是在后面的,吐血。。

代码里面有个小技巧,就是typedef struct XXX{...}XXX,这样就使用XXX代替了struct XXX,可以少打一些字了233.

#include<bits/stdc++.h>
using namespace std;

typedef struct BiTreeNode {
    int data;
    BiTreeNode* left;
    BiTreeNode* right;
    void operator =(BiTreeNode* b) {
        data=b->data;
        left=b->left;
        right=b->right;
    };
} BiTreeNode;

BiTreeNode *root;

void Create(BiTreeNode* root,int data) { //add a node to the tree
    BiTreeNode* tot;
    BiTreeNode* Father;
    BiTreeNode* current;
    tot=(BiTreeNode*)malloc(sizeof(BiTreeNode));//the new point
    tot->data=data;
    tot->left=NULL;
    tot->right=NULL;
    Father=current=root;
    while (current!=NULL) { //find the leaf
        if (current->data<data) {
            Father=current;
            current=current->right;
        }
        else {
            Father=current;
            current=current->left;
        }
    }
    current=Father;

    if (current->data<data) {
        current->right=tot;
    }
    else {
        current->left=tot;
    }
}
int main()
{
    root=(BiTreeNode*)malloc(sizeof(BiTreeNode));
    root->data=10;
    root->left=NULL;
    root->right=NULL;
    Create(root,25);
    Create(root,5);
    Create(root,30);
    Create(root,12408);
    Create(root,233);
    cout<<233;
    return 0;
}
时间: 2024-12-06 20:39:52

[NOIp]二叉树的指针实现的相关文章

二叉树的二叉链表表示和实现

二叉树的二叉链表存储结构 typedef struct BiTNode { TElemType data; BiTNode * lchild, *rchild;//左右孩子指针 }BiTNode, * BiTree; 二叉链表的22个基本操作 #define ClearBiTree DestroyBiTree//清空二叉树和销毁二叉树的操作一样 void InitBiTree(BiTree &T){ T = NULL; } void DestroyBiTree(BiTree &T){ if

TAOCP_2.3.1_遍历二叉树

1. 算法T(以中根序遍历二叉树) 设$T$是指向二叉树的指针:本算法以中根序访问二叉树中的所有节点,并且利用一个辅助栈A. T1. [初始化] 置栈A为空,并置链接变量$P \gets T$. T2. [$P=\bigwedge$?] 如果$P=\bigwedge$,转到步骤T4. T3. [$栈 \Leftarrow P$] (现在P指向要加以遍历的一个非空二叉树.)置 $A \Leftarrow P$:即是,把P的值放入栈A.然后置$P \to LLINK(P)$并返回步骤T2. T4.

数据结构-二叉树 C和C++实现

二叉树,指针域具有两个下一节点的特殊链表结构. 先来看看它的结构 (此处补图) 来看程序中需要使用到的概念: 树根:二叉树的第一个节点 子树:对于某一个节点指针域指向的节点,左指针指向的节点为左子节点,右指针指向的节点为右子节点 树高:树的层数 树宽:树在最多节点一层的节点数 叶子:不具有子树的节点 C语言版本 (此处补程序) C++版本 包含三部分 (此处补图) BiTreeNode.h: #ifndef _BITREENODE_H #define _BITREENODE_H #include

二叉树遍历算法总结(递归与非递归)

一:前言 二叉树的遍历方法分四种:前序,中序,后序以及层次遍历. 其中,前中后遍历方法的实现分递归和非递归,非递归遍历的实现需要借助于栈. 实际上,递归的调用就是一种栈的实现,所以,非递归遍历就需要人工借助栈结构来实现. 而层次遍历需要借助队列. 二:前中后序遍历 递归遍历: 递归遍历的思想和方法很简单,通过调整输出语句来实现前,中,后三种遍历. 代码如下: 1 void show(BiTree T) 2 { 3 if(T) 4 { 5 printf("%c ",T->data)

poj2255 (二叉树遍历)

poj2255 二叉树遍历 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the

二叉树的递归插入【Java实现】

C++中由于有指针的存在,可以让二叉树节点指针的指针作为插入函数的实参,在函数体内通过*操作实现对真实节点指针.节点左孩子指针.节点右孩子指针的改变,这样很容易使用递归将大树问题转化到小树问题.但在JAVA中,由于没有指针只有引用,如果需要递归实现二叉树的元素插入,需要对节点进行包装,同时由于递归时需要将大树问题递归到子树,包装类中的节点需要改变,但因为最后需要的是根节点,所以根节点需要备份,在递归完成后复原.下面是实现代码: 1 package test; 2 3 4 5 public cla

线索二叉树的表示和实现

线索二叉树的数据结构 enum PointerTag//枚举 { Link,Thread//Link(0):指针;thread(1):线索 }; struct BiThrNode { TElemType data;//结点的值 BiThrNode * lchild, *rchild;//左右孩子结点 PointerTag LTag : 2;//左标志,占2bit PointerTag RTag : 2;//右标志,占2bit }; typedef BiThrNode *BiThrTree; 线索

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

一步一步写算法(之排序二叉树的保存和加载)

原文:一步一步写算法(之排序二叉树的保存和加载) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 排序二叉树是我们开发中经常使用到的一种数据结构,它具有较好的插入.删除.查找特性.但是由于二叉树的指针较多,所以相比较其他的数据结构而言,二叉树来得比较麻烦些.但是也不是没有办法,下面介绍一下我个人常用的方法. 我们知道,如果一个二叉树是一个满树的话,那么二叉树的节点应该是按照1.2.3.4依次排开的.但是现实情况是这样的,由于排序二叉树自身