51. 腾讯面试题:一个二叉树,中序遍历,找一个节点的后一个节点

it2022-05-08  7

题目:一个二叉树,中序遍历,找一个节点的后一个节点

二叉树相关的题目问了非常多,今儿去面试又被问到了,这里做一个总结。

类似的题目有:

1)找二叉树的最左节点

2)找二叉树的最右节点

3)中序遍历二叉树,并打印出来。

4)推断一个二叉树是不是全然二叉树。

。。。

兴许再加入

这题的思路:

中序遍历的树的过程是:左--》中--》右

要找当前节点,先推断此节点有没有右子树?

---------     有,则找右子树的最左节点

---------     没有,则父节点,而且此父节点的左子树为此节点分支。

算法例如以下:

//二叉树节点定义 struct Node{         Node* parent;         int data;         Node* left;          Node* right; }; //中序排序找当前节点的后一个节点 Node* find(Node* p) { if(p == NULL) return NULL; if(p->right)//有右孩子 { //找右子树中的最左节点 Node* cp = p->right; while(cp->left) { cp = cp->left; } return cp; } else//没有右孩子 { //找此节点的第一个父节点的左孩子是此分支。 Node* pp = p->parent; while(pp && pp->right == p) { p = pp; pp = p->parent; } return pp; } }

1)找二叉树的最左节点

//找二叉树的最左节点 Node* findleft(Node* p) { if(!p) return NULL; Node* pp = p; while(pp->left) { pp = pp->left; } return pp; } 2)找二叉树的最右节点

//找二叉树的最右节点 Node* findright(Node* p) { if(!p) return NULL; Node* pp = p; while(pp->right) { pp = pp->right; } return pp; } 3)中序遍历二叉树,并打印出来。

//中序遍历二叉树,并打印出来。 void print_mid(Node* p) { if(p == NULL) return; //打印节点p的左子树 print_mid(p->left); //打印节点p cout << p->data << ","; //打印节点p的右子树 print_mid(p->right); }

4)推断一个二叉树是不是全然二叉树。

bool is_complete(tree *root) { queue q; tree *ptr; // 进行广度优先遍历(层次遍历),并把NULL节点也放入队列 q.push(root); while ((ptr = q.pop()) != NULL) { q.push(ptr->left); q.push(ptr->right); } // 推断是否还有未被訪问到的节点 while (!q.is_empty()) { ptr = q.pop(); // 有未訪问到的的非NULL节点,则树存在空洞,为非全然二叉树 if (NULL != ptr) { return false; } } return true; }

转载于:https://www.cnblogs.com/gcczhongduan/p/4293494.html

相关资源:垃圾分类数据集及代码

最新回复(0)