C++中的连续树
连续树定义为:从根节点到叶节点的任何路径上的节点值或权重,使得父节点与其所有直接子节点之间的绝对差值始终为1。
如果我们在根到叶的路径上选择任何节点,则
|节点权重 - 左子节点权重| = |左子节点权重 - 节点权重| = 1,对右子节点也成立
|节点权重 - 右子节点权重| = |右子节点权重 - 节点权重| = 1
图表
让我们通过示例来理解。
下面的树是连续的,因为父节点与其子节点之间的绝对差值始终为1。
下面的树不符合连续树的条件。
查找树是否连续的算法
如果根节点为空,则返回1
如果是叶节点,则返回1,因为树是连续的,这就是叶节点被访问的原因。
如果左子树为空,则检查当前节点与右子节点的连续性(计算权重的绝对差值),并递归地继续处理右子树。
如果右子树为空,则检查当前节点与左子节点的连续性(计算权重的绝对差值),并递归地继续处理左子树。
否则,计算左子节点和右子节点权重的绝对差值,并递归地继续处理左子树和右子树。
伪代码
// Function to check tree is continuous or not struct btreeNode{ int data; btreeNode* left, * right; }; int isContinuous(btreeNode *root){ // if node is NULL return 1, exit condition if (root == NULL) return 1; //if leaf node is reached then tree must be continous during this path if (root->left == NULL && root->right == NULL) return 1; // if no left child if (root->left == NULL) return (abs(root->data - root->right->data) == 1) && isContinuous(root->right); // if no right child if (root->right == NULL) return (abs(root->data - root->left->data) == 1) && isContinuous(root->left); // calculate absoute difference return abs(root->data - root->left->data)==1 && abs(root->data - root->right->data)==1 && isContinuous(root->left) && isContinuous(root->right); }
广告