给定一棵二叉树,其中节点的编号从1到n。给定一个节点和一个正整数K。我们必须在二叉树中打印给定节点的第K个祖先。如果不存在任何这样的祖先,那么打印-1。 例如,在下面给定的二叉树中,节点4和5的第二个祖先是1。节点4的第三个祖先将是-1。
这样做的想法是首先遍历二叉树,并将每个节点的祖先存储在一个大小为n的数组中。例如,假设该数组是anecestor[n]。然后在索引i处,祖先[i]将存储第i个节点的祖先。因此,第i个节点的第二个祖先将是祖先[祖先[i],依此类推。我们将使用这个想法来计算给定节点的第k个祖先。我们可以使用 水平顺序遍历 来填充这些祖先。
下面是上述想法的实现。
C++
/* C++ program to calculate Kth ancestor of given node */ #include <iostream> #include <queue> using namespace std; // A Binary Tree Node struct Node { int data; struct Node *left, *right; }; // function to generate array of ancestors void generateArray(Node *root, int ancestors[]) { // There will be no ancestor of root node ancestors[root->data] = -1; // level order traversal to // generate 1st ancestor queue<Node*> q; q.push(root); while (!q.empty()) { Node* temp = q.front(); q.pop(); if (temp->left) { ancestors[temp->left->data] = temp->data; q.push(temp->left); } if (temp->right) { ancestors[temp->right->data] = temp->data; q.push(temp->right); } } } // function to calculate Kth ancestor int kthAncestor(Node *root, int n, int k, int node) { // create array to store 1st ancestors int ancestors[n+1] = {0}; // generate first ancestor array generateArray(root,ancestors); // variable to track record of number of // ancestors visited int count = 0; while (node!=-1) { node = ancestors[node]; count++; if (count==k) break ; } // print Kth ancestor return node; } // Utility function to create a new tree node Node* newNode( int data) { Node *temp = new Node; temp->data = data; temp->left = temp->right = NULL; return temp; } // Driver program to test above functions int main() { // Let us create binary tree shown in above diagram Node *root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); int k = 2; int node = 5; // print kth ancestor of given node cout<<kthAncestor(root,5,k,node); return 0; } |
JAVA
/* Java program to calculate Kth ancestor of given node */ import java.util.*; class GfG { // A Binary Tree Node static class Node { int data; Node left, right; } // function to generate array of ancestors static void generateArray(Node root, int ancestors[]) { // There will be no ancestor of root node ancestors[root.data] = - 1 ; // level order traversal to // generate 1st ancestor Queue<Node> q = new LinkedList<Node> (); q.add(root); while (!q.isEmpty()) { Node temp = q.peek(); q.remove(); if (temp.left != null ) { ancestors[temp.left.data] = temp.data; q.add(temp.left); } if (temp.right != null ) { ancestors[temp.right.data] = temp.data; q.add(temp.right); } } } // function to calculate Kth ancestor static int kthAncestor(Node root, int n, int k, int node) { // create array to store 1st ancestors int ancestors[] = new int [n + 1 ]; // generate first ancestor array generateArray(root,ancestors); // variable to track record of number of // ancestors visited int count = 0 ; while (node!=- 1 ) { node = ancestors[node]; count++; if (count==k) break ; } // print Kth ancestor return node; } // Utility function to create a new tree node static Node newNode( int data) { Node temp = new Node(); temp.data = data; temp.left = null ; temp.right = null ; return temp; } // Driver program to test above functions public static void main(String[] args) { // Let us create binary tree shown in above diagram Node root = newNode( 1 ); root.left = newNode( 2 ); root.right = newNode( 3 ); root.left.left = newNode( 4 ); root.left.right = newNode( 5 ); int k = 2 ; int node = 5 ; // print kth ancestor of given node System.out.println(kthAncestor(root, 5 ,k,node)); } } |
Python3
"""Python3 program to calculate Kth ancestor of given node """ # A Binary Tree Node # Utility function to create a new tree node class newNode: # Constructor to create a newNode def __init__( self , data): self .data = data self .left = None self .right = None # function to generate array of ancestors def generateArray(root, ancestors): # There will be no ancestor of root node ancestors[root.data] = - 1 # level order traversal to # generate 1st ancestor q = [] q.append(root) while ( len (q)): temp = q[ 0 ] q.pop( 0 ) if (temp.left): ancestors[temp.left.data] = temp.data q.append(temp.left) if (temp.right): ancestors[temp.right.data] = temp.data q.append(temp.right) # function to calculate Kth ancestor def kthAncestor(root, n, k, node): # create array to store 1st ancestors ancestors = [ 0 ] * (n + 1 ) # generate first ancestor array generateArray(root,ancestors) # variable to track record of number # of ancestors visited count = 0 while (node ! = - 1 ) : node = ancestors[node] count + = 1 if (count = = k): break # prKth ancestor return node # Driver Code if __name__ = = '__main__' : # Let us create binary tree shown # in above diagram root = newNode( 1 ) root.left = newNode( 2 ) root.right = newNode( 3 ) root.left.left = newNode( 4 ) root.left.right = newNode( 5 ) k = 2 node = 5 # prkth ancestor of given node print (kthAncestor(root, 5 , k, node)) # This code is contributed by # SHUBHAMSINGH10 |
C#
/* C# program to calculate Kth ancestor of given node */ using System; using System.Collections.Generic; class GfG { // A Binary Tree Node public class Node { public int data; public Node left, right; } // function to generate array of ancestors static void generateArray(Node root, int []ancestors) { // There will be no ancestor of root node ancestors[root.data] = -1; // level order traversal to // generate 1st ancestor LinkedList<Node> q = new LinkedList<Node> (); q.AddLast(root); while (q.Count != 0) { Node temp = q.First.Value; q.RemoveFirst(); if (temp.left != null ) { ancestors[temp.left.data] = temp.data; q.AddLast(temp.left); } if (temp.right != null ) { ancestors[temp.right.data] = temp.data; q.AddLast(temp.right); } } } // function to calculate Kth ancestor static int kthAncestor(Node root, int n, int k, int node) { // create array to store 1st ancestors int []ancestors = new int [n + 1]; // generate first ancestor array generateArray(root,ancestors); // variable to track record of number of // ancestors visited int count = 0; while (node != -1) { node = ancestors[node]; count++; if (count == k) break ; } // print Kth ancestor return node; } // Utility function to create a new tree node static Node newNode( int data) { Node temp = new Node(); temp.data = data; temp.left = null ; temp.right = null ; return temp; } // Driver program to test above functions public static void Main(String[] args) { // Let us create binary tree shown in above diagram Node root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); int k = 2; int node = 5; // print kth ancestor of given node Console.WriteLine(kthAncestor(root,5,k,node)); } } // This code has been contributed by 29AjayKumar |
Javascript
<script> /* JavaScript program to calculate Kth ancestor of given node */ // A Binary Tree Node class Node { constructor() { this .data = 0; this .left = null ; this .right = null ; } } // function to generate array of ancestors function generateArray(root, ancestors) { // There will be no ancestor of root node ancestors[root.data] = -1; // level order traversal to // generate 1st ancestor var q = []; q.push(root); while (q.length != 0) { var temp = q[0]; q.shift(); if (temp.left != null ) { ancestors[temp.left.data] = temp.data; q.push(temp.left); } if (temp.right != null ) { ancestors[temp.right.data] = temp.data; q.push(temp.right); } } } // function to calculate Kth ancestor function kthAncestor(root, n, k, node) { // create array to store 1st ancestors var ancestors = Array(n+1).fill(0); // generate first ancestor array generateArray(root,ancestors); // variable to track record of number of // ancestors visited var count = 0; while (node != -1) { node = ancestors[node]; count++; if (count == k) break ; } // print Kth ancestor return node; } // Utility function to create a new tree node function newNode(data) { var temp = new Node(); temp.data = data; temp.left = null ; temp.right = null ; return temp; } // Driver program to test above functions // Let us create binary tree shown in above diagram var root = newNode(1); root.left = newNode(2); root.right = newNode(3); root.left.left = newNode(4); root.left.right = newNode(5); var k = 2; var node = 5; // print kth ancestor of given node document.write(kthAncestor(root,5,k,node)); </script> |
输出:
1
时间复杂性 :O(n) 辅助空间 :O(n)
方法2: 在这个方法中,首先我们将得到一个元素,它的祖先必须被搜索,从那个节点开始,我们将一个接一个地减少计数,直到我们到达那个祖先节点。 例如——
考虑下面给出的树:
(1)
/
(4) (2)
/
(3) (7) (6)
(8)
然后检查k=0,如果是,则返回该元素作为祖先,否则向上爬一层并减少k(k=k-1)。 最初k=2 我们先搜索8然后, 在8=>检查是否(k==0)但k=2,因此k=k-1=>k=2-1=1,并在7时爬升一级 在7=>检查是否(k==0)但k=1,因此k=k-1=>k=1-1=0,并在4处爬升一级 在4=>检查是否(k==0)是k=0将此节点作为祖先返回。
C++14
// C++ program for finding // kth ancestor of a particular node #include<bits/stdc++.h> using namespace std; // Structure for a node struct node{ int data; struct node *left, *right; node( int x) { data = x; left = right = NULL; } }; // Program to find kth ancestor bool ancestor( struct node* root, int item, int &k) { if (root == NULL) return false ; // Element whose ancestor is to be searched if (root->data == item) { //reduce count by 1 k = k-1; return true ; } else { // Checking in left side bool flag = ancestor(root->left,item,k); if (flag) { if (k == 0) { // If count = 0 i.e. element is found cout<< "[" <<root->data<< "] " ; return false ; } // if count !=0 i.e. this is not the // ancestor we are searching for // so decrement count k = k-1; return true ; } // Similarly Checking in right side bool flag2 = ancestor(root->right,item,k); if (flag2) { if (k == 0) { cout<< "[" <<root->data<< "] " ; return false ; } k = k-1; return true ; } } } // Driver Code int main() { struct node* root = new node(1); root->left = new node(4); root->left->right = new node(7); root->left->left = new node(3); root->left->right->left = new node(8); root->right = new node(2); root->right->right = new node(6); int item,k; item = 3; k = 1; int loc = k; bool flag = ancestor(root,item,k); if (flag) cout<< "Ancestor doesn't exist" ; else cout<< "is the " <<loc<< "th ancestor of [" << item<< "]" <<endl; return 0; } // This code is contributed by Sanjeev Yadav. |
JAVA
// Java program for finding // kth ancestor of a particular node import java.io.*; class Node { int data; Node left, right; Node( int x) { this .data = x; this .left = this .right = null ; } } class GFG{ static int k = 1 ; static boolean ancestor(Node root, int item) { if (root == null ) return false ; // Element whose ancestor is to be searched if (root.data == item) { // Reduce count by 1 k = k- 1 ; return true ; } else { // Checking in left side boolean flag = ancestor(root.left, item); if (flag) { if (k == 0 ) { // If count = 0 i.e. element is found System.out.print( "[" + root.data + "] " ); return false ; } // If count !=0 i.e. this is not the // ancestor we are searching for // so decrement count k = k - 1 ; return true ; } // Similarly Checking in right side boolean flag2 = ancestor(root.right, item); if (flag2) { if (k == 0 ) { System.out.print( "[" + root.data + "] " ); return false ; } k = k - 1 ; return true ; } } return false ; } // Driver code public static void main(String[] args) { Node root = new Node( 1 ); root.left = new Node( 4 ); root.left.right = new Node( 7 ); root.left.left = new Node( 3 ); root.left.right.left = new Node( 8 ); root.right = new Node( 2 ); root.right.right = new Node( 6 ); int item = 3 ; int loc = k; boolean flag = ancestor(root, item); if (flag) System.out.println( "Ancestor doesn't exist" ); else System.out.println( "is the " + (loc) + "th ancestor of [" + (item) + "]" ); } } // This code is contributed by avanitrachhadiya2155 |
Python3
# Python3 program for finding # kth ancestor of a particular node # Structure for a node class node: def __init__( self , data): self .left = None self .right = None self .data = data # Program to find kth ancestor def ancestor(root, item): global k if (root = = None ): return False # Element whose ancestor is # to be searched if (root.data = = item): # Reduce count by 1 k = k - 1 return True else : # Checking in left side flag = ancestor(root.left, item); if (flag): if (k = = 0 ): # If count = 0 i.e. element is found print ( "[" + str (root.data) + "]" , end = ' ' ) return False # If count !=0 i.e. this is not the # ancestor we are searching for # so decrement count k = k - 1 return True # Similarly Checking in right side flag2 = ancestor(root.right, item) if (flag2): if (k = = 0 ): print ( "[" + str (root.data) + "]" ) return False k = k - 1 return True # Driver code if __name__ = = "__main__" : root = node( 1 ) root.left = node( 4 ) root.left.right = node( 7 ) root.left.left = node( 3 ) root.left.right.left = node( 8 ) root.right = node( 2 ) root.right.right = node( 6 ) item = 3 k = 1 loc = k flag = ancestor(root, item) if (flag): print ( "Ancestor doesn't exist" ) else : print ( "is the " + str (loc) + "th ancestor of [" + str (item) + "]" ) # This code is contributed by rutvik_56 |
C#
// C# program for finding // kth ancestor of a particular node using System; // Structure for a node public class Node { public int data; public Node left, right; public Node( int x) { this .data = x; this .left = this .right = null ; } } class GFG{ static int k = 1; // Program to find kth ancestor static bool ancestor(Node root, int item) { if (root == null ) return false ; // Element whose ancestor is // to be searched if (root.data == item) { // Reduce count by 1 k = k - 1; return true ; } else { // Checking in left side bool flag = ancestor(root.left, item); if (flag) { if (k == 0) { // If count = 0 i.e. element is found Console.Write( "[" + root.data + "] " ); return false ; } // If count !=0 i.e. this is not the // ancestor we are searching for // so decrement count k = k - 1; return true ; } // Similarly Checking in right side bool flag2 = ancestor(root.right, item); if (flag2) { if (k == 0) { Console.Write( "[" + root.data + "] " ); return false ; } k = k - 1; return true ; } } return false ; } // Driver code static public void Main() { Node root = new Node(1); root.left = new Node(4); root.left.right = new Node(7); root.left.left = new Node(3); root.left.right.left = new Node(8); root.right = new Node(2); root.right.right = new Node(6); int item = 3; int loc = k; bool flag = ancestor(root, item); if (flag) Console.WriteLine( "Ancestor doesn't exist" ); else Console.WriteLine( "is the " + (loc) + "th ancestor of [" + (item) + "]" ); } } // This code is contributed by patel2127 |
Javascript
<script> class Node { constructor(x) { this .data=x; this .left = this .right = null ; } } function ancestor(root, item) { if (root == null ) { return false ; } if (root.data == item) { k = k - 1; return true ; } else { let flag = ancestor(root.left, item); if (flag) { if (k == 0) { document.write( "[" + (root.data) + "] " ); return false ; } k = k - 1; return true ; } let flag2 = ancestor(root.right, item); if (flag2) { if (k == 0) { document.write( "[" + (root.data) + "] " ); return false ; } k = k - 1; return true ; } } } let root = new Node(1) root.left = new Node(4) root.left.right = new Node(7) root.left.left = new Node(3) root.left.right.left = new Node(8) root.right = new Node(2) root.right.right = new Node(6) let item = 3 let k = 1 let loc = k let flag = ancestor(root, item) if (flag) document.write( "Ancestor doesn't exist" ) else document.write( "is the " + (loc) + "th ancestor of [" + (item) + "]" ) // This code is contributed by rag2127 </script> |
[4] is the 1th ancestor of [3]
本文由 严酷的阿加瓦尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。