题目:一个二叉树,中序遍历,找一个节点的后一个节点
二叉树相关的题目问了非常多,今儿去面试又被问到了,这里做一个总结。
类似的题目有:
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; } }
//找二叉树的最左节点 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; }