题目描述:
二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。
只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。
如果节点 i 没有左子节点,那么 leftChild[i] 就等于 -1。右子节点也符合该规则。
注意:节点没有值,本问题中仅仅使用节点编号。
链接:https://leetcode-cn.com/problems/validate-binary-tree-nodes
题解 :解决这个题之前,应该先了解,什么样的树是二叉树
- 只有一个根节点
- 一个子节点只有一个父节点
- 子节点不能指向其父节点
- 该题中,已经限制左右节点,则不会存在出现节点度为3的情况
故本题,采取的思路为先寻找根节点,再采取先序遍历的方式进行验证。
- 一个二叉树只有一个根节点,若有多个,则直接判错
- 采取先序遍历,n个节点,则可以遍历n次
- 若遍历提前结束,或者借用的辅助栈不为空,则就不是一颗二叉树。
代码:
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;
}
};