private int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
}
private int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
IS Sibling
boolean isSibling(Node node, Node a, Node b)
{
// Base case
if (node == null)
return false;
return ((node.left == a && node.right == b) ||
(node.left == b && node.right == a) ||
isSibling(node.left, a, b) ||
isSibling(node.right, a, b));
}
Construct Binary Tree from given Parent Array
/*
Input: parent[] = {1, 5, 5, 2, 2, -1, 3}
Output: root of below tree
5
/ \
1 2
/ / \
0 3 4
/
6
*/
// Creates a node with key as 'i'. If i is root, then it changes
// root. If parent of i is not created, then it creates parent first
void createNode(int parent[], int i, Node created[])
{
// If this node is already created
if (created[i] != null)
return;
// Create a new node and set created[i]
created[i] = new Node(i);
// If 'i' is root, change root pointer and return
if (parent[i] == -1)
{
root = created[i];
return;
}
// If parent is not created, then create parent first
if (created[parent[i]] == null)
createNode(parent, parent[i], created);
// Find parent pointer
Node p = created[parent[i]];
// If this is first child of parent
if (p.left == null)
p.left = created[i];
else // If second child
p.right = created[i];
}
/* Creates tree from parent[0..n-1] and returns root of
the created tree */
Node createTree(int parent[], int n)
{
// Create an array created[] to keep track
// of created nodes, initialize all entries
// as NULL
Node[] created = new Node[n];
for (int i = 0; i < n; i++)
created[i] = null;
for (int i = 0; i < n; i++)
createNode(parent, i, created);
return root;
}
Find Level
int level(Node node, Node ptr, int lev)
{
// base cases
if (node == null)
return 0;
if (node == ptr)
return lev;
// Return level if Node is present in left subtree
int l = level(node.left, ptr, lev + 1);
if (l != 0)
return l;
// Else search in right subtree
return level(node.right, ptr, lev + 1);
}
// A utility function that prints all nodes on the
// path from root to target_leaf
boolean printPath(Node node, Node target_leaf)
{
// base case
if (node == null)
return false;
// return true if this node is the target_leaf or
// target leaf is present in one of its descendants
if (node == target_leaf || printPath(node.left, target_leaf)
|| printPath(node.right, target_leaf))
{
System.out.print(node.data + " ");
return true;
}
return false;
}