首页 > 其他分享 >二级指针创建二叉树节点与一级指针创建二叉树节点

二级指针创建二叉树节点与一级指针创建二叉树节点

时间:2023-04-12 13:34:58浏览次数:43  
标签:Node 一级 int ptr 二叉树 节点 指针

 1、c++中的struct结构体变量定义 可以直接 “类型名 变量名”,c中只能 “struct 类型名 变量名” ,可以通过typedef 达到相同的效果;

   struct _x1 { ...}x1; 是定义了类_x1和_x1的对象实例x1,

  typedef struct _x2{ ...} x2;  定义了类_x2和_x2的类别名x2 ;

  typedef struct {int num;int age;}aaa,bbb,ccc;相当于三个类型别名;

2、二级指针:p置空,p的值 (nullptr) 其实就是0;但是p本身是一个变量,仍然具有地址,二级指针指向p;

#include <bits/stdc++.h>
using namespace std;
int main(){

    int* p = nullptr;
    int**p1 = nullptr;
    p1 = &p;
    cout << p << endl;
    cout << p1 << endl;
    system("pause");
    return 0;
}

/*
0
0x61ff08
*/

反例:调用函数并没有改变p值;

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

void first__ptr(int *ptr){
    ptr = new int(100);
    cout << ptr << endl;
    delete ptr;
}

int main(){
    int* p = nullptr;
    cout << p << endl;
    first__ptr(p);
    cout << p << endl;
    system("pause");
    return 0;
}
/*
0
0xd318b0
0
*/

修改:通过传递二级指针,操作*ptr达到修改p的值;

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

void first__ptr(int *ptr){
    ptr = new int(100);
    cout << ptr << endl;
    delete ptr;
}
void second_ptr(int **ptr){
    *ptr = new int(100); 
    cout << *ptr << endl;
    delete ptr;
}

int main(){
    int* p = nullptr;
    int** p1 = &p;
    cout << p << endl;
    second_ptr(p1);
    cout << p << endl;
    system("pause");
    return 0;
}
/*
0
0x1e18b0
0x1e18b0
*/

3、创建二叉树节点时使用二级指针(参考二叉树创建为什么用二级指针 - Pearl_zju - 博客园 (cnblogs.com) )

首先是二叉树创建需要使用指针代表节点的缘故,达到链表的效果;也就是每个节点自身就是个一级指针;

个人总结:要使用一级指针的话:递归函数形参是一级指针,但是得有返回值,也是一级指针,函数中操作的是指针本身,返回值也是指针本身;Node* createNode(Node* node) ; 

     要使用二级指针的话:递归函数形参是二级指针,但是不需要返回值; 函数中操作的是*node1,即操作一级指针变量的值,void createNode(Node ** node1);

因为一级指针传递进去的是值传递,不影响调用者的值;但是可以通过函数返回值赋值给调用者,达到改变原值的效果;二级指针是一级指针变量的地址,那么操作*node1,也就是在操作一级指针;

这儿可以理解为:将节点和二级指针都降一级; 节点自身相当于一个 int a变量,二级指针相当于一级指针 int*p = &a,那么要想在另一个函数中改变a的值,传参的时候就需要传递变量a的地址,操作*p就相当于改变a的值,函数也不需要返回值就能改变原值了;

代码实现:

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

typedef struct Node{
    int data;
    Node* left, *right;
}Node,*Tree;

/*二级指针*/
void Create(Tree* T){
    int num;
    /*CTRL + Z 结束*/
    if(cin >> num){
        *T = new Node();
        (*T)->data = num;
        Create(&((*T)->left));
        Create(&((*T)->right));
    }
}
/*一级指针*/
Tree create1(Tree T){
    int num;
    if(cin >> num){
        T = new Node();
        T->data = num;
        T->left = create1(T);
        T->right = create1(T);
    }else{
        T = nullptr;
    }
    return T;
}
void preorder(Tree T){
    if(T == nullptr){
        return;
    }
    cout << T->data << "\t";
    preorder(T->left);
    preorder(T->right);
}

int main(){
    Tree T;
    cout << "put in binary tree:" << endl;
    //Create(&T);
    T = create1(T);
    preorder(T);

    cout << endl;
    system("pause");
    return 0;
}
/*
put in binary tree:
7 2 10  1 3 8 11^Z
7       2       10      1       3       8       11
*/

 

标签:Node,一级,int,ptr,二叉树,节点,指针
From: https://www.cnblogs.com/xuan01/p/17308747.html

相关文章

  • 快慢指针使用
    1.快慢指针实现删除链表的倒数第n个节点原题链接删除第n个节点解题思路为设置两个指针,一个fast指针,一个slow指针,先让fast指针移动n次,然后fast和slow同时移动,当fast移动到最后一位的时候,删除slow当前节点。classSolution{public:ListNode*removeNthFromEnd(ListNode*h......
  • UVa 112 Tree Summing (scanf()去空格&递归&二叉树遍历)
    112-TreeSummingTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=48BackgroundLISPwasoneoftheearliesthigh-levelprogramminglanguagesand,withFORTRAN,isoneoft......
  • MFC-GetMainWnd获取主窗口指针
     CWinApp*pwin=AfxGetApp();//获取当前应用进程的指针CWnd*pWnd=pwin->GetMainWnd();//获取主窗口指针CGetMainWndDlg*pDlg=(CGetMainWndDlg*)pWnd;//主窗口指针转化成对话框类指针pDlg->SetWindowText(_T("练习"));CWnd*pWnd1=pWn......
  • 动力节点王鹤SpringBoot3笔记——第七章 视图技术Thymeleaf
    7视图技术ThymeleafThymeleaf是一个表现层的模板引擎,一般被使用在Web环境中,它可以处理HTML,XML、JS等文档,简单来说,它可以将JSP作为JavaWeb应用的表现层,有能力展示与处理数据。Thymeleaf可以让表现层的界面节点与程序逻辑被共享,这样的设计,可以让界面设计人员、业......
  • 动力节点SpringBoot3笔记——视图技术Thymeleaf
    7视图技术ThymeleafThymeleaf是一个表现层的模板引擎,一般被使用在Web环境中,它可以处理HTML,XML、JS等文档,简单来说,它可以将JSP作为JavaWeb应用的表现层,有能力展示与处理数据。Thymeleaf可以让表现层的界面节点与程序逻辑被共享,这样的设计,可以让界面设计人员、业......
  • m基于GA遗传优化和OSPF协议的WSN最短路由算法matlab仿真,并输出节点的不同层域
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要2.1GA遗传优化        GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按......
  • 野指针与悬空指针
    1.什么是野指针(wildpointer)?Apointerincwhichhasnotbeeninitializedisknownaswildpointer.野指针(wildpointer)就是没有被初始化过的指针。2.什么是悬空指针(danglingpointer)?Ifapointerstillreferencestheoriginalmemoryafterithasbeenf......
  • 如何优雅的解决空指针问题
    空指针异常(NullPointerException)(NPE)是开发过程中最常见的问题之一前人已经总结了很多避免空指针问题的方法。包括:对于非空的对象,使用Objects.requireNonNull(target)判空对于数组对象,返回空数组而非null对于非数组对象,使用NullObjectpattern等等但上面的方......
  • docker swarm 删除节点
    有时临时在dockerswarm集群上增加节点(node3),过后需要删除节点#获取node信息dockernodelsIDHOSTNAMESTATUSAVAILABILITYMANAGERSTATUSENGINEVERSIONj52o5frhmphiksqz0xq1mkbbh*node1......
  • 二叉树的顺序存储
    二叉树的顺序存储二叉树的存储形式按照二叉树的结点层次编号,然依次后储存在数组当中二叉树的抽象数据类型表示二叉树顺序存储结构的示意图例题二叉树顺序存储结构的缺点1.顺序存储结构的大小固定不能动态的变化2.如果如图上为右单支树一样浪费空间所以顺序存储结构......