验证二叉树

该博客讨论了如何验证给定的节点数组是否能组成一棵有效的二叉树。通过检查根节点的数量和先序遍历来判断,如果有多个根节点或者遍历未完成但栈非空,则返回错误。代码中实现了一个名为validateBinaryTreeNodes的函数,通过计算节点的度数找到根节点,并采用先序遍历的方法进行验证。
摘要由CSDN通过智能技术生成

题目描述:
二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。

只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。

如果节点 i 没有左子节点,那么 leftChild[i] 就等于 -1。右子节点也符合该规则。

注意:节点没有值,本问题中仅仅使用节点编号。

链接:https://leetcode-cn.com/problems/validate-binary-tree-nodes

题解 :解决这个题之前,应该先了解,什么样的树是二叉树

  1. 只有一个根节点
  2. 一个子节点只有一个父节点
  3. 子节点不能指向其父节点
  4. 该题中,已经限制左右节点,则不会存在出现节点度为3的情况

故本题,采取的思路为先寻找根节点,再采取先序遍历的方式进行验证。

  1. 一个二叉树只有一个根节点,若有多个,则直接判错
  2. 采取先序遍历,n个节点,则可以遍历n次
  3. 若遍历提前结束,或者借用的辅助栈不为空,则就不是一颗二叉树。

代码:

class Solution {
public:
    bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
        vector<int> degree(n);//度
        int root = 0;//根节点
        int rootnumber = 0;//根节点数量
        stack<int> Sup;//辅助栈
        for(int i = 0; i < n; ++i)
        {
            if(leftChild[i] != -1)
                ++degree[leftChild[i]];
            if(rightChild[i] != -1)
                ++degree[rightChild[i]];
        }
        for(int i = 0; i < n; ++i)//寻找根节点
        {
            if(degree[i] == 0)
            {
                root = i;
                ++rootnumber;
            }
        }
        if(rootnumber != 1)//只能有一个根,0或者多个都是错误的
            return false;
        Sup.push(root);
        while(n && !Sup.empty())//n个节点只会进行n次遍历,则当n次遍历完,栈不为空,或者栈已经提前为空时,则是错误的
        {
            root = Sup.top();
            Sup.pop();
            if(rightChild[root] != -1)
                Sup.push(rightChild[root]);
            if(leftChild[root] != -1)
                Sup.push(leftChild[root]);
            --n;
        }
        if(n != 0 || !Sup.empty())
            return false;
        return true;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值