首页 > 其他分享 >求二叉树中某结点的所有祖宗结点,该结点不唯一

求二叉树中某结点的所有祖宗结点,该结点不唯一

时间:2023-08-23 09:13:02浏览次数:35  
标签:结点 TreeNode top 二叉树 祖宗 return data Stack

利用非递归后序遍历的方法。

当匹配成功时,此时,栈中结点都是目标结点的祖宗结点。

目前有个小问题,会重复打印的祖宗结点,但是可以根据根节点判断有多少个目标结点

#include <stdio.h>
#include <stdlib.h>

#define MaxSize 100

typedef struct Node{
    struct Node *lchild,*rchild;
    int data;
}TreeNode,*Tree;

typedef struct{
    TreeNode* data[MaxSize];
    int top;
}Stack;

void InitStack(Stack &S)
{
    S.top=-1;
}

bool isEmpty(Stack S)
{
    if(S.top==-1)
        return true;
    return false;
}

bool isFull(Stack S)
{
    if(S.top==MaxSize-1)
        return true;
    return false;
}

bool Push(Stack &S,TreeNode* p)
{
    if(isFull(S))
        return false;
    S.data[++S.top]=p;
    return true;
}

bool Pop(Stack &S,TreeNode* &p)
{
    if(isEmpty(S))
        return false;
    p=S.data[S.top--];
    return true;
}

bool GetTop(Stack S,TreeNode* &p)
{
    if(isEmpty(S))
        return false;
    p=S.data[S.top];
    return true;
}

void CreateTree(Tree &T)
{
    int x;
    scanf("%d",&x);
    if(x==-1)
    {
        T=NULL;
        return;
    }
    else
    {
        T=(Tree)malloc(sizeof(TreeNode));
        T->data=x;
        printf("输入%d的左结点:",x);
        CreateTree(T->lchild);
        printf("输入%d的右结点:",x);
        CreateTree(T->rchild);
    }
}

void Search(Tree T,int x)
{
    if(T==NULL)
        return;
    Stack S;
    InitStack(S);
    TreeNode* p=T;
    TreeNode* r=NULL;
    TreeNode* current;
    while(p || !isEmpty(S))
    {
        if(p)
        { 
            if(p->data==x)
            {
                for(int i=S.top;i>=0;i--)
                {
                    current=S.data[i];
                    printf("%d ",current->data);    
                }
            } 
            Push(S,p);
            p=p->lchild;
        }
        else
        {
            GetTop(S,p);
            if(p->rchild && p->rchild!=r)
                p=p->rchild;
            else
            {
                Pop(S,p);
                r=p;
                p=NULL;
            }
        }
    }
}

int main()
{
    Tree T;
    CreateTree(T);
    Search(T,4);
    return 0;
}

 

标签:结点,TreeNode,top,二叉树,祖宗,return,data,Stack
From: https://www.cnblogs.com/simpleset/p/17650128.html

相关文章

  • day14 - 二叉树part01
    144. 二叉树的前序遍历详解/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullp......
  • 关于Azure-存储账户-文件共享的内网访问-专用终结点连接-配置说明
    这里以标准性能的StorageV2的存储账户为例(即同时包含了容器,文件共享,队列,表)本文的实验环境,是想让Azure上的虚拟机通过内网访问文件共享,而数据连接不走Internet公网我们可以使用到存储账户,菜单下的Networking配置,下面的【专用终结点连接|Privateendpointconnections】 创建......
  • 二叉树的遍历大冒险
    二叉树的遍历大冒险〇、前言01文章内容一般提到二叉树的遍历,我们是在说前序遍历、中序遍历、后序遍历和层序遍历或者说三序遍历+层序遍历,毕竟三序和层序的遍历逻辑相差比较大下面讨论三序遍历的递归方法、非递归方法和非递归迭代的统一方法然后再讨论一下层序的一般迭......
  • 代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的
     530.二叉搜索树的最小绝对差   卡哥建议:需要领悟一下二叉树遍历上双指针操作,优先掌握递归   题目链接/文章讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html ......
  • 代码随想录算法训练营第二十天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树
      654.最大二叉树    卡哥建议:又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历    题目链接/文章讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5......
  • 【二叉树前沿篇】树
    1树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……......
  • 求先序,中序,后序等遍历中第k个结点的值
    代码自己想的,23年8月21没有仔细看王道书上的代码和自己写的有什么区别,测试应该是对的。但是如果k的值大于结点个数没有做判断#include<stdio.h>#include<stdlib.h>typedefstructTNode{intdata;structTNode*lchild,*rchild;}TreeNode,*Tree;voidCreate......
  • #yyds干货盘点# LeetCode程序员面试金典:完全二叉树的节点个数
    题目:给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例1:输入:r......
  • 【二叉树前沿篇】树
    1树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……......
  • 万字长文彻底搞懂二叉树
    算法是面试考察的重点,数据结构是算法的根基。今天主要和大家探讨下数据结构中的二叉树,当然也不仅限于二叉树,还有其他类型的扩展。1基础知识一棵树由称作跟的节点r以及0个或多个非空的树T1,T2,...Tk组成,这些子树中每一颗的根都被来至根r的一条有向的边所连接。深度:对任意......