|

楼主 |
发表于 2019-7-1 09:41:24
|
显示全部楼层
- typedef struct tag_char
- {
- int parent_val ; /* 存储父亲节点的值*/
- int level ; /* 存储目标节点的在树中的层次数*/
- }char_t;
- void getNodeInfo( struct TreeNode* parent_node , /*父亲节点指针 */
- struct TreeNode* cur_node , /*当前节点指针 */
- int val , /*目标节点的值 */
- int level , /*当前节点在树中的层次数 */
- char_t* char_s /*指向存储目标节点信息的结构体 */
- )
- {
-
- /*已到叶子节点*/
- if(cur_node==NULL)
- {
- return ;
- }
-
- /*已经找到目标节点(存储目标节点的相关信息)*/
- if(cur_node->val == val)
- {
- /*只有根节点的父亲节点是NULL,根据堂兄弟节点的定义和二叉树的性质,根节点跟任何其他节点均不要可能是堂兄弟节点*/
- if(parent_node==NULL)
- {
- char_s->parent_val = -1;
- }
- else
- {
- /*存储父亲节点的值*/
- char_s->parent_val = parent_node->val;
- }
- /*存储目标节点的层次*/
- char_s->level = level;
- return ;
- }
-
- /*遍历左子树*/
- getNodeInfo(cur_node,cur_node->left ,val,level+1,char_s);
- /*遍历右子树*/
- getNodeInfo(cur_node,cur_node->right,val,level+1,char_s);
-
- }
- /* 常规方法:通过遍历获取节点信息,需要两个节点的父节点不一样且在同一层次才算堂兄弟节点*/
- bool isCousins(struct TreeNode* root, int x, int y)
- {
- bool ret_val = false;
- char_t char_x = {-1,-1};
- char_t char_y = {-1,-1};
-
-
-
- getNodeInfo(NULL,root,x,0,&char_x);
- getNodeInfo(NULL,root,y,0,&char_y);
-
- if( ( char_x.parent_val !=-1 )
- &&( char_x.level !=-1 )
- &&( char_y.parent_val !=-1 )
- &&( char_y.level !=-1 )
- &&( char_x.parent_val != char_y.parent_val )
- &&( char_x.level == char_y.level )
- )
- {
- ret_val = true;
- }
-
- return ret_val;
- }
- /*
- 执行用时 :4 ms, 在所有 C 提交中击败了90.63%的用户
- 内存消耗 :7.5 MB, 在所有 C 提交中击败了100.00%的用户
- */
复制代码 |
|