Dùng mã giả code cho dễ hiểu nhé. Ví dụ cho bài toán tìm số lớn nhất nhỏ hơn node cho trước:
// Nếu bên trái mà tồn tại null thì đi tìm số lớn nhất bên trái.
if this.left != null
return findMax(this.left)
else
// Nếu không có node bên trái thì phải tìm xem cha của nó có không vì node bên phải chắc chắn lớn hơn nó.
parent = this.parent, T = this
// Nếu nó không phải là root và nó là node bên trái của cha nó nghĩa là cha nó lớn hơn nó thì phải duyệt tiếp đến ông nó.
while(parent != null && T == parent.left)
T = parent, parent = T.parent
// Nếu tìm đến root rồi mà không có thằng nào thỏa mãn nghĩa là trong cây đó không có thằng nào bé hơn nó hết.
if parent is null
return -1
else
// Nếu không phải là root nghĩa là cái thằng này là thằng xem ảnh đi.
return parent
Thằng node start là thằng d thằng e nằm bên trái sẽ lớn hơn d. Tương tự thằng b và c cũng lớn hơn d. Tìm ra thằng a nhỏ hơn d.
Nếu duyệt tiếp thằng right thì thằng right lớn hơn thằng b do nếu b lớn hơn right thì nó đã nằm bên phải thằng right rồi. Điều đó kéo theo là right lớn hơn d.
Nếu duyệt tiếp thằng left thì thằng này sẽ nhỏ hơn thằng a rồi nên a chính là thằng cần tìm.
Đấy ví dụ bài toán này không duyệt từ root thì không có parent- node thì không làm được. Còn nếu duyệt từ root thì đơn giản thôi. Chạy tìm mút mùa ra được thằng d xong tìm ngược lại. Chưa kể input là d thì cũng không tìm được chỗ root ở đâu cả.
Lâu lâu làm mấy bài này đau não quá.